我正在尝试使用以下代码将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?
答案 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
的一部分安装。
这些将阻止缓冲,并希望按照您希望的顺序交错流。