Files
translations/bash-3-man/redirection.md
2014-09-17 22:41:50 +08:00

6.6 KiB
Raw Permalink Blame History

重定向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

如果重定向操作符是>,并且启用了内建命令setnoclobber选项,那么如果word扩展后得到的文件名存在并且是一个普通的文件,重定向将失败。 如果重定向操作符是>|, 或者重定向操作符是>并且没有启用内建命令setnoclobber选项,那么即使word得出的文件名存在,也会尝试进行重定向。

追加式重定向输出(Appending Redirected Output)

这种方式的输出重定向使得以word扩展结果为名的文件被打开并通过文件描述符n从尾部添加。 如果没有指定n就使用标准输出(文件描述符1)。如果文件不存在,它将被创建。

重定向的一般形式是:

[n]>>word

Redirecting Standard Output and Standard Error

bash允许使用这种结构将标准输出和标准错误(文件描述符12) 重定向到以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。如果文件不存在,它将被创建。