6.6 KiB
重定向(REDIRECTION)
在命令执行前,它的输入和输出可能被重定向(redirect),使用一种shell可以解释的特殊记法。
重定向也可以用于为当前shell执行环境打开和关闭文件。
下列重定向操作符可以前置或者放在简单命令(simple command)之中的任何位置,或者放在命令之后。
重定向是以出现的顺序进行处理的,从左到右。
下列描述中,如果文件描述符被忽略,并且第一个重定向操作符是<,那么重定向指的是标准输入(文件描述符是0)。
如果重定向操作符的第一个字符是>,那么重定向指的是标准输出(文件描述符是1)。
下列描述中,重定向操作符之后的词如果没有特殊说明,都要经过brace expansion, tilde expansion, parameter expansion, command substitution, arithmetic expansion, quote removal, pathname expansion, 还有 word splitting。
如果扩展为多于一个词,bash将报错。
注意重定向的顺序非常重要。例如,命令
ls > dirlist 2>&1
将标准输出和标准错误重定向到文件dirlist,而命令
ls 2>&1 > dirlist
只会将标准输出重定向到文件dirlist,因为在标准输出被重定向到文件dirlist中之前,标准错误被复制为标准输出。
一些文件名在重定向中被bash特殊处理,如下表所示:
/dev/fd/<fd>
如果<fd>是一个合法的整数,文件描述符<fd>将被复制。/dev/stdin文件描述符0被复制。/dev/stdout文件描述符1被复制。/dev/stderr文件描述符2被复制。/dev/tcp/<host>/<port>如果<host>是一个合法的主机名或Internet地址,并且<port>是一个整数端口号或服务名,bash试图建立与相应的套接字的TCP连接。/dev/udp/<host>/<port>如果<host>是一个合法的主机名或Internet地址,并且<port>是一个整数端口号或服务名,bash试图建立与相应的套接字的UDP连接。
打开或创建文件错误将导致重定向出错。
重定向输入
重定向输入(Redirecting Input)使得以word扩展结果为名的文件被打开并通过文件描述符n读取,如果没有指定n那么就作为标准输入(文件描述符为0)读取。
重定向输入的一般形式是:
[n]<word
重定向输出
重定向输出(Redirecting Output)使得以word扩展结果为名的文件被打开并通过文件描述符n写入,如果没有指定n那么就作为标准输出(文件描述符为1)写入。
重定向的一般形式是:
[n]>word
如果重定向操作符是>,并且启用了内建命令set的noclobber选项,那么如果word扩展后得到的文件名存在并且是一个普通的文件,重定向将失败。
如果重定向操作符是>|, 或者重定向操作符是>并且没有启用内建命令set的noclobber选项,那么即使word得出的文件名存在,也会尝试进行重定向。
追加式重定向输出(Appending Redirected Output)
这种方式的输出重定向使得以word扩展结果为名的文件被打开并通过文件描述符n从尾部添加。
如果没有指定n就使用标准输出(文件描述符1)。如果文件不存在,它将被创建。
重定向的一般形式是:
[n]>>word
Redirecting Standard Output and Standard Error
bash允许使用这种结构将标准输出和标准错误(文件描述符1和2) 重定向到以word扩展结果为名的文件中。
有两种重定向标准输出/标准错误的形式:
&>word
还有
>&word
两种形式中,推荐使用第一种。它与
>word 2>&1
在语义上等价。
Here Documents
这种重定向使得shell从当前源文件读取输入,直到遇到仅包含word的一行(并且没有尾部空白)为止。
直到这一点的所有行被用作 命令的标准输入。
here-document的格式是:
<<[-]word
here-document
delimiter
不会对word进行参数扩展、命令替换、算术扩展或者路径名扩展。
如果word中任何字符是引用的,delimiter将是对word进行引用删除的结果,here-document中的行不会被扩展。
如果word没有被引用,here-documnet中的所有行都要经过参数扩展、命令替换和算术扩展。
在后一种情况下,字符序列\<newline>被忽略;必须用\来引用字符\、$和 ```。
如果重定向操作符是<<-, 那么所有前导的tab字符都被从输入行和包含delimiter的行中删除。
这样使得shell脚本中的here-document可以被更好地缩进。
Here Strings
here-document的变种,形式是
<<<word
word被扩展,提供给命令作为标准输入。
复制文件描述符(Duplicating File Descriptors)
重定向操作符
[n]<&word
用于复制文件描述符。如果word扩展为一个或多个数字,n代表的文件描述符将成为那个文件描述符的复制。
如果word中的数字并未指定一个被用于读取的文件描述符,将产生一个重定向错误。
如果word扩展为-,文件描述符n将被关闭。
如果没有指定n,将使用标准输入(文件描述符0)。
类似的,操作符
[n]>&word
用于复制输出文件描述符。
如果没有指定n,将使用标准输出(文件描述符1)。
如果word中的数字并未指定一个被用于输出的文件描述符,将产生一个重定向错误。
特殊情况下,如果忽略了n,并且word并非扩展为一个或多个数字,标准输出和标准错误将被重定向,和前面描述的一样。
Moving File Descriptors
重定向操作符
[n]<&digit-
将文件描述符digit移动为文件描述符n;如果没有指定n,则移动标准输入(文件描述符0)
digit复制为n之后就被关闭了。
类似的,重定向操作符
[n]>&digit-
将文件描述符digit移动为文件描述符n,或标准输出(文件描述符1),如果没有指定n的话。
Opening File Descriptors for Reading and Writing
重定向操作符
[n]<>word
使得以word扩展结果为名的文件被打开,通过文件描述符n进行读写。
如果没有指定n那么就使用文件描述符0。如果文件不存在,它将被创建。