Bash - 在stdout之前捕获的stderr

时间:2014-02-09 02:58:10

标签: bash shell stdout stderr

我正在尝试使用以下代码将stderr和stdout捕获到变量:

FileIDs="$(plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1)"

但是,当我回显存储在变量中的内容时,首先显示任何stderr行,然后是stdout行。

Error: File not found at path file3.plist
File1ID
File2ID
File4ID

如果在终端执行此plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1,则按预期打印输出:

File1ID
File2ID
Error: File not found at path file3.plist
File4ID

如何以正确的顺序捕获stderr和stdout?

1 个答案:

答案 0 :(得分:5)

你不应该依赖stdout和stderr的订购。它们是两个独立的流,应该这样对待。

也就是说,当输出不是tty时,你看到的差异很可能是stdlib缓冲的影响。如果您使用的是GNU系统,可以试试

cmd=$(stdbuf -o 0 -e 0 plutil -key "ID" file1.plist file2.plist file3.plist file4.plist 2>&1)

在其他系统上,尝试unbuffer命令,作为expect的一部分安装。

这些将阻止缓冲,并希望按照您希望的顺序交错流。