使用Bash可以方便的用<和>实现输出输入的重定向,本文讨论重定向的一些细节和技巧。本文介绍部分是对Bash Quick Reference相关内容的翻译。
基础知识
文件描述符(File Descriptor),用一个数字(通常为0-9)来表示一个文件。常用的文件描述符如下:
文件描述符 | 名称 | 常用缩写 | 默认值 |
0 | 标准输入 | stdin | 键盘 |
1 | 标准输出 | stdout | 屏幕 |
2 | 标准错误输出 | stderr | 屏幕 |
我们在简单地用<或>时,相当于使用 0< 或 1>(下面会详细介绍)。
管道“|”(pipe line),把上一个命令的 stdout 接到下一个命令的 stdin;
tee 命令的作用是在不影响原本 I/O 的情况下,将 stdout 复制一份到档案去;
简单重定向
- cmd > file
- 把cmd命令的输出重定向到文件file中。如果file已经存在,则清空原有文件,使用bash的noclobber选项可以防止覆盖原有文件。
- cmd >> file
- 把cmd命令的输出重定向到文件file中,如果file已经存在,则把信息加在原有文件后面。
- cmd < file
- 使cmd命令从file读入
- cmd << text
- 从命令行读取输入,直到一个与text相同的行结束。除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换。如果使用 <<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考后面的例子。
- cmd <<< word
- 把word(而不是文件word)和后面的换行作为输入提供给cmd。
- cmd n<> file
- 以读写方式打开file,并且定义文件描述符fd为n
- cmd >| file
- 功能同>,但即便在设置了noclobber时也会覆盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能。
使用文件描述符的重定向
使用文件描述符的重定向都使用了&符号。
cmd >&n | 把输出送到文件描述符n |
cmd m>&n | 把输出 到文件符m的信息重定向到文件描述符n |
cmd >&- | 关闭标准输出 |
cmd <&n | 输入来自文件描述符n |
cmd m<&n | m来自文件描述各个n |
cmd <&- | 关闭标准输入 |
cmd <&n- | 移动输入文件描述符n而非复制它。(需要解释) |
cmd >&n- | 移动输出文件描述符 n而非复制它。(需要解释) |
>&实际上复制了文件描述符,这使得ls > dirlist 2>&1与ls 2>&1 > dirlist的效果不一样。man bash的Redirection节中提及了这段内容。
重定向的组合应用
cmd 2>file | 把文件描述符2重定向到file,即把错误输出存到file中。 |
cmd > file 2>&1 | 把标准错误重定向到标准输出,再重定向到file,即stderr和stdout都被输出到file中 |
cmd &> file | 功能与上一个相同,更为简便的写法。 |
cmd >& file | 功能仍与上一个相同。 |
cmd > f1 2>f2 | 把stdout重定向到f1,而把stderr重定向到f2 |
tee files | 把stdout原样输出的同时,复制一份到files中。 |
tee files | 把stderr和stdout都输出到files中,同时输出到屏幕。 |