【问题标题】:Does any magic "stdout" file exists? [duplicate]是否存在任何神奇的“stdout”文件? [复制]
【发布时间】:2017-12-27 16:38:11
【问题描述】:

某些实用程序无法输出到标准输出。

例子

util out.txt

它有效。但有时我想将输出传递给其他程序,例如:

util out.txt | grep test

linux中是否存在任何神奇的“stdout”文件,所以当我替换上面的out.txt时,它将数据重定向到stdout管道?


注意:我知道util out.txt && cat out.txt | grep test,所以请不要发布这样的答案。

【问题讨论】:

  • 您的实用程序是否符合 POSIX 实用程序语法准则?如果是这样,它将根据位置识别- 表示标准输入或标准输出。
  • 我相信this在这里得到了回答。
  • 为什么您的程序本身也不支持标准输出,这一点很重要。正如 Basile 所说,一些程序在编写它们时会在其输出文件中跳转,而不是进行一次从前到后的传递。在这种情况下,直接将数据流式传输到标准输出而不事先将其缓冲到文件中实际上是不可能的。

标签: linux bash shell pipe


【解决方案1】:

您可以使用/dev/stdout。但如果程序需要lseek(2)(或mmap(2)),这并不总是有效。

通常/dev/stdout/proc/self/fd/1 的符号链接(请参阅proc(5))。

IIRC 某些程序的某些版本(可能是 GNU awk)正在处理特别 /dev/stdout 文件名(例如,能够在 /proc/ 被挂载的情况下工作)。

程序参数的一个常见但不通用的约定是考虑-,当用作文件名时,表示标准输出(或标准输入)。例如,请参阅 tar(1)-f - 一起使用。

如果您编写一些实用程序,我建议尽可能遵循 - 约定并记录是否需要可搜索 stdout

一些程序正在测试 stdoutstdin 是否是一个终端(例如使用isatty(3))以表现不同,例如通过使用ncurses。如果您编写这样的程序,我建议您提供一个程序选项来禁用该检测。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2020-08-24
    • 2020-02-03
    • 1970-01-01
    相关资源
    最近更新 更多