shell脚本的输入输出和重定向

1、输入和输出
Linux系统将每个对象当作文件处理,包括输入和输出进程。Linux用文件描述符来标识每个文件对象。bash shell保留了三个文件描述符(0、1和2)。

文件描述符缩写描述
0STDIN标准输入
1STDOUT标准输出
2STDERR标准错误

这三个特殊文件描述符会处理脚本的输入和输出。shell用它们将shell默认的输入和输出导向到相应的位置。
(1)STDIN
STDIN文件描述符代表shell的标准输入。对终端界面来说,标准输入是键盘。shell从STDIN文件描述符对应的键盘获得输入,在用户输入时处理每个字符。

例如,当我们在命令行上只输入cat命令时,它会从STDIN接受输入。输入一行,cat命令就会显示出一行。

[root@relay3.mobvista.com:101.251.254.6 shell]#cat
This is a test
This is a test

在使用输入重定向符号(<)时,Linux会用重定向指定的文件来替换标准输入文件描述符,它会读取文件并提取数据。

[root@relay3.mobvista.com:101.251.254.6 shell]#cat  < testfile
test data

(2)STDOUT
STDOUT文件描述符代表shell的标准输出。在终端界面上,标准输出就是终端显示器。默认情况下,大多数bash命令会将输出导向STDOUT文件描述符,但是我们也可以用输出重定向来改变。

[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l > testfile2
[root@relay3.mobvista.com:101.251.254.6 shell]#cat testfile2
total 8
-rw-r--r--. 1 root root  10 Jul 31 17:36 testfile
-rw-r--r--. 1 root root   0 Jul 31 17:39 testfile2
-rwxr--r--. 1 root root 185 Jul 31 16:53 test.sh

(3)STDERR
shell通过特殊的STDERR文件描述符来处理错误消息。STDERR文件描述符代表shell的标准错误输出。shell或shell中运行的程序和脚本出错时生成的错误消息都会发送到这个位置。默认情况下,STDERR文件描述符会和STDOUT文件描述符指向同样的地方,即默认情况下,错误消息也会输出到显示器输出中。
但是STDERR并不会随着STDOUT的重定向而发生改变,就像下面这样:

[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l errorfile > testfile3
ls: cannot access errorfile: No such file or directory
[root@relay3.mobvista.com:101.251.254.6 shell]#ls testfile3
testfile3

尽管testfile3创建成功了,但错误消息却依旧会显示在屏幕上。那么,下面我们看看具体怎么将错误消息重定向。

2、重定向错误
(1)只重定向错误
前面我们已经知道了STDERR文件描述符被设成2。选择只重定向错误消息,则将该文
件描述符值放在重定向符号前即可。

例如,ls命令的正常STDOUT输出仍然会发送到默认的STDOUT文件描述符,也就是显示器。由于文件描述符2的输出被重定向到文件out,则shell会将生成的所有错误消息直接发送到out文件中。

[root@relay3.mobvista.com:101.251.254.6 shell]#ls
file1
[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l file1 file2 2> out
-rw-r--r--. 1 root root 0 Jul 31 17:52 file1
[root@relay3.mobvista.com:101.251.254.6 shell]#cat out
ls: cannot access file2: No such file or directory

(2)重定向错误和正常数据
我们可以使用两个重定向符号,将正常输出和错误消息分离开来。

[root@relay3.mobvista.com:101.251.254.6 shell]#ls
file1
[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l file1 file2 > out1 2> out2
[root@relay3.mobvista.com:101.251.254.6 shell]#ls
file1  out1  out2
[root@relay3.mobvista.com:101.251.254.6 shell]#cat out1
-rw-r--r--. 1 root root 0 Jul 31 17:52 file1
[root@relay3.mobvista.com:101.251.254.6 shell]#cat out2
ls: cannot access file2: No such file or directory

当然,如果你愿意,也可以将STDERR和STDOUT的输出重定向到同一个输出文件,重定向符号&>可以做到。

[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l file1 file2 out1 out2 &> out
[root@relay3.mobvista.com:101.251.254.6 shell]#cat out		//错误消息会优先显示
ls: cannot access file2: No such file or directory
-rw-r--r--. 1 root root  0 Jul 31 17:52 file1
-rw-r--r--. 1 root root 45 Jul 31 17:59 out1
-rw-r--r--. 1 root root 51 Jul 31 17:59 out2

有时候,你可能不想显示脚本的输出,这在将脚本作为后台进程运行时很常见。但当运行在后台的脚本出现错误消息时,shell会通过电子邮件将它们发给进程的属主,这
会很麻烦。因此,我们可以将STDERR重定向到一个叫作null文件的特殊文件。Linux系统上null文件的位置是/dev/null,重定向到该位置的任何数据都会被丢掉。

[root@relay3.mobvista.com:101.251.254.6 shell]#ls
file1  out1  out2
[root@relay3.mobvista.com:101.251.254.6 shell]#ls -l file1 file2 out1 out2 2> /dev/null
-rw-r--r--. 1 root root  0 Jul 31 17:52 file1
-rw-r--r--. 1 root root 45 Jul 31 17:59 out1
-rw-r--r--. 1 root root 51 Jul 31 17:59 out2
[root@relay3.mobvista.com:101.251.254.6 shell]#cat /dev/null

3、重定向输入
我们可以使用与脚本中重定向STDOUT和STDERR相同的方法来将STDIN从键盘重定向到其他位置。exec命令允许我们将STDIN重定向到Linux系统上的文件中:如exec 0< file,这个命令会告诉shell它应该从文件file中获得输入,而不是STDIN。

[root@relay3.mobvista.com:101.251.254.6 shell]#cat file
This is the first line
This is the second line
This is the third line
[root@relay3.mobvista.com:101.251.254.6 shell]#cat test.sh
exec 0< file
count=1
while read line
do
        echo "Line $count: $line"
        count=$[ $count + 1 ]
done
[root@relay3.mobvista.com:101.251.254.6 shell]#sh test.sh
Line 1: This is the first line
Line 2: This is the second line
Line 3: This is the third line
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值