我知道一个人可以定义附加文件描述符供临时使用。然而,我看到了常见 CLI 工具支持的“stdmeta”文件描述符的实际用途。该文件描述符将输出以下行不是数据的一部分但不是错误。如何向 Unix 或 Linux 提出这样的补充呢?
一种示例用法是输出 ps 命令的标头:
$ ps
PID TTY TIME CMD
6394 pts/15 00:00:00 bash
10294 pts/15 00:00:00 ps
10295 pts/15 00:00:00 bash
如果想要对输出进行排序、grep 或以其他方式过滤,则必须要么丢失标头,要么将其混入数据中。这可以通过以下方法解决将第一行重定向到 stderr,或一个无数不同的创意解决方案,但显然这些都是笨拙的临时方案且难以记住的解决方法因为没有专用的 stdmeta 文件描述符。
另一个例子是 的输出curl
。卷曲通过管道将元数据传输到 stderr这样它就可以告知人们进展情况,而不会增加可能通过管道传输其输出的应用程序的复杂性。同样,这是使用 stderr 作为缺失的 stdmeta 的替代品。
我应该写信给兰卡梅勒并陈述我的情况?由于这会破坏与某些 Unix 遗留应用程序的兼容性,我是否应该将我的案例转向更 Unixy 的机构?
答案1
您关于捕获元数据的建议标准元似乎很简单,因此您可以丢弃它,转而使用出现在的“真实”数据标准输出以一致的方式。 (在绿地情况下不一定是坏要求。)
在实践层面上,程序被编码来处理标准输出和标准错误。如果你要创建一个新的标准元通常将部分数据发送到现有描述符中,您很容易严重破坏许多事情。考虑您的提案ps -ef
以及执行类似操作的遗留代码ps -ef | sed 1d | ...
。如果您不再通过以下方式发送标头标准输出而是将其推到标准元这段代码将会表现不正确。
在我看来,最好-q
在所有实用程序上都有一个可用的标志(用于安静输出)。但即使这样,当您考虑到几乎每个了解其实用程序可以使用的脚本-q
都必须处理那些不了解其实用程序的旧版本时,即使这样也充满了困难。