Unix 命令行的功能之一是使用输入/输出重定向和管道。在本次会议中,我们介绍了输入、输出和错误流的重定向。
Linux I/O重定向
标准输入、标准输出和标准错误
bash shell 具有三个基本流;它从 stdin(流 0)获取输入,将输出发送到 stdout(流 1),并将错误消息发送到 stderr(流 2)。
键盘通常用作标准输入,而标准输出和标准错误都连接到显示器。这可能会让 Linux 新用户感到困惑,因为没有明显的方法来识别 stdout 和 stderr。有经验的用户知道将输出与错误分开非常有用。
下一节将解释如何重定向这些流。
输出重定向
标准输出 (>)
stdout 可以使用大于号重定向。扫描该行时,shell 将看到 > 符号并清除文件。
事实上,> 符号是 1> 的缩写(stdout 被称为流 1)。
请注意,bash shell 在执行参数 0 之前有效地从命令行删除了重定向。这意味着在此命令的情况下:
shell 只计算两个参数(echo = 参数 0,hello = 参数 1)。在参数计数发生之前重定向被删除。
输出文件被删除
扫描该行时,shell 将看到 > 符号并清除文件!由于这发生在解析参数 0 之前,这意味着即使命令失败,文件也将被清除!
过设置 noclobber 选项可以防止使用 > 时擦除文件。
否决noclobber
noclobber 可以用 >| 来否决。
追加 (>>)
使用 >> 将输出附加到文件。
错误重定向
2> 标准错误
重定向 stderr 是通过 2> 完成的。这对于防止屏幕上出现错误消息非常有用。
下面的屏幕截图显示了 stdout 重定向到文件,stderr 重定向到 /dev/null。写 1> 与 > 相同。
要将 stdout 和 stderr 重定向到同一文件,请使用 2>&1。
请注意,重定向的顺序很重要。例如,命令
将标准输出(文件描述符 1)和标准错误(文件描述符 2)定向到文件目录列表,而命令
仅将标准输出定向到文件 dirlist,因为标准错误在标准输出重定向到 dirlist 之前复制了标准输出。
输出重定向和管道
默认情况下,在命令行上使用管道时,无法在 stderr 内进行 grep,因为只传递了 stdout。
使用 2>&1 您可以强制 stderr 转到 stdout。这使得管道中的下一个命令能够作用于两个流。
您不能同时使用 1>&2 和 2>&1 来切换 stdout 和 stderr。
您需要第三个流来在管道符号之后切换 stdout 和 stderr。
连接 stdout 和 stderr
&> 构造会将 stdout 和 stderr 放入一个流中(到一个文件)。
输入重定向
标准输入(<)
重定向标准输入是通过 < (0< 的简写)完成的。
here-is-document是一种追加输入直到遇到特定序列(通常是EOF)的方法。 EOF 标记可以按字面输入,也可以使用 Ctrl-D 调用。
检查下面的代码
如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。