这是一个有趣的效果。例如,你可以将内容从一个文件描述符传递到另一个文件描述符:
find /etc -iname "*.service" 1> services.txt 2>&1
这会将 stderr 导向到 stdout ,而 stdout 通过管道被导向到一个文件中 services.txt 中。
它再次出现:& 发信号通知 Bash 1 是目标文件描述符。
标准文件描述符的另一个问题是,,当你从一个管道传输到另一个时,你执行此操作的顺序有点违反直觉。例如,按照上面的命令。它看起来像是错误的方式。你也行像这样阅读它:“将输出导向到文件,然后将错误导向到标准输出。” 看起来错误输出会在后面,并且在输出到标准输出(1 )已经完成时才发送。
但这不是文件描述符的工作方式。文件描述符不是文件的占位符,而是文件的输入和(或)输出通道。在这种情况下,当你做 1> services.txt 时,你的意思是 “打开一个写管道到 services.txt 并保持打开状态”。1 是你要使用的管道的名称,它将保持打开状态直到该行的结尾。
如果你仍然认为这是错误的方法,试试这个:
find /etc -iname "*.service" 2>&1 1>services.txt
并注意它是如何不工作的;注意错误是如何被导向到终端的,而只有非错误的输出(即 stdout )被推送到 services.txt 。
这是因为 Bash 从左到右处理 find 的每个结果。这样想:当 Bash 到达 2>&1 时,stdout (1 )仍然是指向终端的通道。如果 find 给 Bash 的结果包含一个错误,它将被弹出到 2 ,转移到 1 ,然后留在终端!
然后在命令结束时,Bash 看到你要打开 stdout (1 ) 作为到 services.txt 文件的通道。如果没有发生错误,结果将通过通道 1 进入文件。
相比之下,在:
find /etc -iname "*.service" 1>services.txt 2>&1
1 从一开始就指向 services.txt ,因此任何弹出到 2 的内容都会导向到 1 ,而 1 已经指向最终去的位置 services.txt ,这就是它工作的原因。
在任何情况下,如上所述 &> 都是“标准输出和标准错误”的缩写,即 2>&1 。
这可能有点多,但不用担心。重新导向文件描述符在 Bash 命令行和脚本中是司空见惯的事。随着本系列的深入,你将了解更多关于文件描述符的知识。 【编辑推荐】 - 不要再吐槽了,Linux Mint 官网重新设计了
- 两款Linux桌面中的图形化操作PDF的工具
- 如何使用Linux Cockpit来管理系统性能
- 如何使用'fsck'修复Linux中的文件系统错误
- Linux 5.0发布,新特性来袭
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0 (编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|