在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。