• 输入:对一个文件输入,除了键盘输入外,还可以通过一个文件输入

  • 输出:执行一个命令,会有相应的输出到屏幕上。输出有标准的正确输出和错误输出。

  • 重定向:把一个输出结果,再输出到另一个文件或一个终端

 

1、重定向

linux中有三种标准输入输出:

  • STDIN就是标准输入,默认从键盘读取信息

  • STDOUT是标准输出,默认将输出结果输出至终端,也就是显示器之类的东西

  • STDERR是标准的错误信息,默认也会显示在终端上。

 

由于STDOUT与STDERR都会默认显示在终端上,为了区分:

0

表示STDIN,标准输入

1

表示STDOUT,标准输出

2

表示STDERR,标准错误

&

表示所有的正确和错误输出

 

#禁止覆盖重定向现有文件

#如果还是要强制覆盖,使用">|"

set -C

 

#允许覆盖重定向

set +C

 

2、输出重定向

2.1、标准正确输出重定向

  • 1> 覆盖式重定向。不加前面的1,默认就是正确输出

  • 1>> 追加式重定向。

 

2.2、标准错误输出重定向

  • 2> 覆盖

  • 2>> 追加

 

2.3、怎么判断一个命令的输出是正确输出还是错误输出呢?

例1:

#将标准正确输出,重定向到find.out

#将标准错误输出,重定向到fine.err

find /etc -name passwd >find.out 2>find.err

 

例2:

#如果还有输出,说明这个重定向方式没起作用的,也就是说这是一个错误的输出,反之,就是一个正确的输出。

adfkldf >> /tmp/t.txt

 

例3:

#只是判断上一次命令有没有执行成功,不能判断输出是一个标准正确还是错误输出。

echo $? 

 

例4:

#把输出结果丢到垃圾筒

ls > /dev/null 

 

2.4、怎么同时把标准正确和错误的输出重定向到同一个文件呢?

find /home -name kiosk 1>>/tmp/f1 2>>/tmp/f1

  • 这种方式会打乱输出,先重定向正确输出,才会输出错误输出。

 

find /home -name kiosk &> /tmp/f1 

  • 这种方法就不会打乱输出了

  • &表示所有正确和错误的输出

 

有时候希望将一个错误输出重新定向到正确输出,就是将2的结果重定向至1中,就有了"2>1"这样的思路,如果按照上面的写法,系统会默认将错误输出重定向到一个名字为1的文件中,而非标准输出中。因此需要加&进行区分,就有了 2>&1

 

#把一个错误输出转换成正确输出,然后再以正确输出重定向到/tmp/f1文件

find /home -name kiosk > /tmp/f1 2>&1 

 

3、输入重定向

从一个文件的标准输出,再把这个输出作为输入到另一个文件

 

3.1、cat

cat,默认,将键盘的输入,输出到屏幕上

 

#通过键盘输入,重定向到f1这个文件,以ctrl+d结束

cat > /tmp/f1

 

#把/etc/passwd这个文件内容作为输入给cat,然后重定向到f1这个文件

cat > /tmp/f1 < /etc/passwd 

 

#定义一个结束符,当输入EOF,键盘输入就会结束。

#注意:EOF不是固定字符,可以自己随便定义

cat > /tmp/f1 <<”EOF” 

 

3.2、tr

tr用来从标准输入中通过替换或删除操作进行字符转换

  • 默认为替换

  • -d,删除指定字符

  • -s 删除所有重复出现字符序列,只保留第一个

 

#删除换行符和制表符

cat file | tr -d "\n\t" > new_file

 

#删除空行

#空行,也有一个换行符,将多个连续的换行符删掉,也就是把空行删除了

cat file | tr -s "\n" > new_file

 

#将/etc/fstab文件中的所有a,换成A,b换成B,c换成C

#tr命令,替换字符

tr abc ABC < /etc/fstab

 

#将所有小写字母,替换成大写输出

tr 'a-z' 'A-Z' < /etc/fstab

 

4、管道

4.1、| 

把管道符前面的命令的标准输出,当作后面命令的输入。

cat /etc/passwd | more

 

4.2、tee 

tee命令读取标准输入,把这些内容同时输出到标准输出和(多个)文件中

要注意的是:在使用管道时,前一个命令的标准错误输出不会被tee读取。

 

#tee,默认覆盖保存

cat /etc/passwd | tee f.txt

 

#-a,追加

pwd | tee -a f.txt

 

5、read命令

接收标准输入(键盘)的输入,得到输入后,read命令将数据放入一个标准变量中

 

#将键盘的输入,存放到name这个变量中

read name

 

#取变量的值

echo $name

 

#-p,打印一句话,然后等用户输入

read -p "Enter your name:" name