文件描述符
默认情况下始终有3个"文件"处于打开状态,stdin (键盘), stdout(屏幕), and stderr(错误消息输出到屏幕上)。这3个文件和其他打开的文件都可以被重定向。对于重定向简单的解释就是捕捉一个文件,命令, 程序,脚本, 或者甚至是脚本中的代码块的输出,然后将这些输出作为输入发送到另一个文件,命令, 程序,或脚本中.每个打开的文件都会被分配一个文件描述符。stdin,stdout, 和stderr的文件描述符分别是0,1, 和 2。对于正在打开的额外文件,保留了描述符3到9。在某些时候将这些格外的文件描述符分配给stdin,stdout, 或者是stderr作为临时的副本链接是非常有用的。在经过复杂的重定向和刷新之后需要把它们恢复成正常的样子。
COMMAND_OUTPUT>
#重定向stdout到一个文件.
#如果没有这个文件就创建,否则就覆盖.
>filename
#> 会把文件"filename"截断为0长度.
#如果文件不存在,那么就创建一个0长度的文件(与'touch'的效果相同)
COMMAND_OUTPUT>>
#重定向stdout到一个文件.
#如果文件不存在,那么就创建它, 如果存在,那么就追加到文件后边.
1>filename
#重定向stdout到文件"filename".
1>>filename
#重定向并追加stdout到文件"filename".
2>filename
#重定向stderr到文件"filename".
2>>filename
#重定向并追加stderr到文件"filename".
&>filename
#将stdout和stderr都重定向到文件"filename".
2>&1
#重定向stderr到stdout.
#得到的错误消息与stdout一样,发送到一个地方
i>&j
#重定向文件描述符i到 j.
#指向i文件的所有输出都发送到j中去.
>&j
#默认的,重定向文件描述符1(stdout)到j.
#所有传递到stdout的输出都送到j中去.
0<FILENAME
<FILENAME
#从文件中接受输入.
#与">"是成对命令,并且通常都是结合使用.
关闭文件描述符
n<&- 关闭输入文件描述符n.
0<&-,<&- 关闭stdin.
n>&- 关闭输出文件描述符n.
1>&-,>&- 关闭stdout.
exec
内建命令exec 是用来给文件分配一个文件描述符。使用
execfdN> file
分配文件描述符N给file 进行输出:
execfdN< file
示例:
exec6<&0 # 将文件描述符#6与stdin链接起来.
# 保存了stdin.
exec< data-file #stdin被文件"data-file"所代替.
reada1 # 读取文件"data-file"的第一行.
reada2 # 读取文件"data-file"的第二行.
echo
echo"Following lines read from file."
echo"-------------------------------"
echo$a1
echo$a2
exec0<&6 6<&-
# 现在将stdin从fd#6中恢复,因为刚才我们把stdin重定向到#6了,
#+然后关闭fd #6 ( 6<&-), 好让这个描述符继续被其他进程所使用.