加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 检测stdout是否被重定向到管道(而不是文件,字符设备,终

发布时间:2020-12-13 19:52:49 所属栏目:Linux 来源:网络整理
导读:理想情况下,这可以在 shell中编写脚本,但Perl或 Python可以. C代码可能会有所帮助,但可能会降低成本/收益. 我认识到重定向到FIFO(命名管道)可能与真实管道无法区分, 这就是我不太关心的边缘情况. 严格的POSIX解决方案是最好的,UNIX / Linux变体独立是最好的,
理想情况下,这可以在 shell中编写脚本,但Perl或 Python可以.
C代码可能会有所帮助,但可能会降低成本/收益.

我认识到重定向到FIFO(命名管道)可能与真实管道无法区分,
这就是我不太关心的边缘情况.

严格的POSIX解决方案是最好的,UNIX / Linux变体独立是最好的,但至少在Darwin(MacOS X)上运行的东西是我现在需要的.

在你写下答案之前 – I already know about test -t – 这将告诉我stdout是否是一个终端(在这种情况下它绝对不是一个管道 – 但它不会告诉我stdout是否已被重定向到一个文件,非终端字符设备,或UNIX域套接字而不是管道.

预期用例:我有一个命令应该在shell的反引号中运行,
这样它就可以输出设置环境变量的命令.
如果stdout没有重定向到管道,我希望命令中止错误
因为在那种情况下它肯定没有被eval`mycommand`;调用.

如果在反引号中运行命令时shell会设置一些特殊的环境变量会有所帮助,但由于它可能特定于bash或zsh或其他东西,因此管道检测更为重要.

解决方法

(我的评论转向按照Alex Dupuy的建议回答)
既然你说你可以使用perl,我想你可以使用它的-p文件测试运算符( perldoc.perl.org/functions/-X.html);类似于perl -e’exit(-p STDOUT?0:1);’将告诉你stdout是否管道或fifo(没有区分它们).

Fwiw,从shell调用它正是我使用perl -e的原因:)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读