重定向(REDIRECTION)
在命令执行前,它的输入和输出可能被 redirected (重定向), 使用一种 shell 可以解释的特殊记法。重定向也可以用于为当前 shell 执行环境 打开和关闭文件。下列重定向操作符可以前置或者放在 simple command (简单命令) 之中的任何位置,或者放在 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 试图建立与相应的 socket (套接字) 的 TCP 连接。
/dev/udp/host/port
如果 host 是一个合法的主机名或 Internet 地址,并且 port 是 一个整数端口号或服务名,bash 试图建立与相应的 socket (套接字) 的 UDP 连接。
打开或创建文件错误将导致重定向出错。