【Bash百宝箱】shell重定向

本文详细介绍了Shell中的输入、输出重定向及其各种形式,包括标准输出和标准错误输出的重定向,输出重定向的追加,即插即用脚本与字符串,文件描述符的复制与移动,以及文件描述符的读写。

在shell中,可以对输入、输出进行重定向,顺序从左到右。Linux有三个特殊的文件描述符,分别是标准输入、标准输出和标准错误输出,对应于“/dev/stdin”、“/dev/stdout”、和“/dev/stderr”,也即“/dev/fd/0”、“/dev/fd/1”和“/dev/fd/2”。在shell重定向中,常对这三个文件描述进行操作。

1、输入重定向

输入重定向的基本格式为:

[n]<word

输入重定向会打开word扩展后所形成的文件名以备读取,并将其作为文件描述符n。如果没有指定n,则将其作为标准输入,即文件描述符0。
例子:

$ cat test.txt
hello world
$ cat <test.txt
hello world

2、输出重定向

输出重定向的基本格式为:

[n]>[l]word

输出重定向会打开word扩展后所形成的文件名以备写入,并将其作为文件描述符n。如果没有指定n,则将其作为标准输出,即文件描述符1。如果文件不存在,就先创建它;否则,清空这个文件中的内容。当输出重定向的符号为“>”时,而且打开了内建命令set的选项noclobber,如果文件存在且是一个普通文件,重定向就会失败,此时,若重定向符号为“>|”或者没有打开内建命令set的选项noclobber,重定向则不会失败。
例子:

$ cat test.txt 
hello
$ cat test2.txt 
world
$ cat test2.txt > test.txt
$ cat test.txt
world
$ cat test2.txt > test3.txt
$ cat test3.txt 
world

3、输出重定向的追加

输出重定向追加的基本格式为:

[n]>>word

输出重定向追加会打开word扩展后所形成的文件名以备写入,并将其作为文件描述符n。如果没有指定n,则将其作为标准输出,即文件描述符1。如果文件不存在,就先创建它;否则,在文件原有内容的基础上进行追加,不会对原有文件进行清空。

$ cat test.txt 
hello
$ cat test2.txt 
world
$ cat test2.txt >> test.txt
$ cat test.txt
hello
world
$ cat test2.txt >> test3.txt
$ cat test3.txt 
world

4、标准输出及标准错误输出重定向

输出重定向包括标准输出和标准错误输出,但它们属于两个不同的文件描述符,标准输出为1,标准错误输出为2,两者也可以同时进行重定向,格式如下:

&>word
>&word
>word 2>&1

例子(文件Makefile中的内容为“$(info hellomake)” ):

$ cat Makefile 
$(info hellomake)
$ make
hellomake
make: *** 无目标。 停止。
$ make > result
make: *** 无目标。 停止。
$ cat result 
hellomake
$ make 2> result
hellomake
$ cat result 
make: *** 无目标。 停止。
$ make &> result
$ cat result 
hellomake
make: *** 无目标。 停止。

上面三种用法是等效的,不过优先使用第一种用法,同样支持输出重定向的追加,格式如下:

&>>word
>>word 2>&1

5、即插即用脚本

什么是即插即用脚本?先看如下格式:

<<[-]word
    here-document
delimiter

即插即用脚本也是一种重定向,指示shell从当前文本源中读取输入,直至遇到只包含word的一行而结束,这时,已读取的所有行都作为命令的标准输入。在Android源码的文件“build/envsetup.sh”中就有这样的用法。一般情况下,word和delimiter相同,开始位置如果有连接符“-”的话,here-document和delimiter行首的空白符将被忽略。

例如test.sh:

function foo()
{
cat << MARK
a
    a1
    a2
b
    b1
    b2
MARK
}

function bar()
{
cat <<- EOF
a
    a1
    a2
b
    b1
    b2
    EOF
}

执行foo的输出为:

a
    a1
    a2
b
    b1
    b2

执行bar的输出为:

a
a1
a2
b
b1
b2

6、即插即用字符串

即插即用字符串是即插即用脚本的一种变体,格式如下:

<<<word

即插即用字符串把word进行扩展后作为标准输入提供给对应的命令。

例子:

$ foo=helloworld
$ cat <<< $foo
helloworld

7、文件描述符的复制

重定向运算符:

[n]<&word

用于复制输入文件描述符。如果word扩展后是一个或多个数字,文件描述符n就是与这些数字对应的文件描述符的拷贝。如果word中的数字没有指定用来打开、输入的文件描述符,重定向就会失败。如果word扩展后为连接符“-”,文件描述符n就会关闭。如果没有指定n,就使用标准输入,即文件描述符0。

重定向运算符:

[n]>&word

用于复制输出文件描述符。如果没有指定n,就使用标准输出,即文件描述符1。如果word中的数字没有指定用来打开、输出的文件描述符,重定向就会失败。如果word扩展后为连接符“-”,文件描述符n就会关闭。有一种特殊情况,当没有指定n时,而且word扩展后不是数字也不是连接符“-”,标准输出和标准错误输出将会同时进行重定向,在前面的例子中也提到了,“标准输出及标准错误输出重定向”的第二种方法,其第三种方法是复制输出文件描述符的一种应用 。

8、文件描述符的移动

重定向运算符:

[n]<&digit-

移动文件描述符digit到n,如果n没有指定的话,使用标准输入即文件描述0,之后文件描述符digit就关闭了。

重定向运算符:

[n]>&digit-

移动文件描述符digit到n,如果n没有指定的话,使用标准输出即文件描述1,之后文件描述符digit就关闭了。

提示:可以看出,文件描述符的复制与移动的格式类似,只是有无连接符“-”,结果大不同

9、文件描述符的读写

重定向运算符:

[n]<>word

打开word扩展后对应的文件,文件不存在时就创建该文件,打开文件进行读、写,关联的文件描述符为n,当n没有指定时,就使用文件描述符0。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值