管道只能传递程序的标准输出(stdout)。要通过管道传递标准错误(stderr),您需要将stderr重定向到与stdout相同的目标。您可以选择关闭stdout或将其重定向到/dev/null以仅获取stderr。以下是一些示例代码:
另一个简单的示例是重定向stdout和stderr:
这在像dialog这样的程序中有明显的应用,它通过屏幕绘制窗口(使用ncurses),并将结果返回到stderr。处理这个问题的一种方法是将stderr重定向到临时文件。
在上面的示例中,我们要么完全丢弃了stdout,要么将其发送到已知设备(用户终端的/dev/tty)。还可以仅管道stderr,但保持stdout不受影响(在不预先知道脚本输出去向的情况下)。这有点棘手。
也可以在不使用exec的情况下完成相同的操作:
关闭fd 3(3>&-)以防止命令继承它。请注意,bash允许在一个重定向中同时复制和关闭:1>&3- 您可以在Linux上尝试以下内容查看差异:
要显示一个对话框的一行命令:
这将使对话框窗口正常工作,但通过sed修改的是对话框的输出(返回给stderr)。
使用ProcessSubstitution也可以实现类似的效果:
这将通过tr命令将标准错误输出重定向到管道。
更多如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。
Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved