文件描述符(fd)
Linux 下的数据流(stream)由文件描述符来进行表示。当一个用户进程被创建的时候,系统会自动创建 3 个。
fd0: stdin, 标准输入 fd1: stdout, 标准输出 fd2: stderr, 标准错误(输出)
输入重定向
输入重定向表示将本来需要从标准输入获取的数据流变成从另一个输入源获取。
wc
wc
命令将等待用户输入直到按下 Ctrl+D
后返回统计的值。
而如果给出一个文件作为输入源,命令将会立即返回该文件的信息
wc < /etc/passwd
# 32 98 1843
输出重定向
与输入重定向相同,输出重定向将从标准输出的输入流重定向到另一个输出源。
ls > dir.out
ls >> dir.out
将 ls
输出的内容保存到 dir.out
中。>> 表示使用追加的方式而不是覆盖原来的内容。
当 >
前面不指定 fd 号的时候,将默认使用标准输出(fd1, stdout),如果需要重定向别的输出流则需要指定。
例如重定向标准错误(fd2, stderr)
ls /usr/tmp 2> dir.err
ls /usr/tmp 2>> dir.err
在屏幕上获得正常的输出结果,同时将所有的错误信息保存到 dir.err
中。
如果需要将 stdout 和 stderr 全部重定向到文件中则可以写成
ls >dir 2>>dir
# ls &> dir
ls >>dir 2>>dir
# ls &>> dir
使用 &>
表示同时重定向 stdout 和 stderr
将 stderr 的输出重定向到 stdout 上
在 >
的左边直接加数字表示使用对应的 fd 号。但如果要在右边则需要加上 &,例如
ls 2>&1
# 将 fd2 重定向到 fd1
有些命令(例如 grep
)不能直接操作 stderr 的内容,则需要先重定向到 stdout
nginx -V 2>&1 | grep 'realip'
# nginx -V 2>&1 >/dev/null | grep 'realip'
# 加上 >/dev/null 将不显示原来的 stdout
临时创建fd
{ command 2>&1 1>&3 | grep a 1>&2; } 3>&1
# 使用 fd3 作为临时 buffer
command 2> >(grep a)
# >(grep a) 为临时创建的 fd,将 stderr 重定向到此 fd