【发布时间】:2020-09-03 07:29:47
【问题描述】:
我正在运行一个命令,该命令(很可能)将文本输出到 stderr 和 stdout。我想将 stderr 和 stdout 保存到同一个文件,但我只想将 stderr 打印到终端。
我怎样才能让它工作?我试过mycommand 1>&2 | tee file.txt >/dev/null,但不会在终端上打印任何东西。
【问题讨论】:
-
这方面的棘手之处在于保持准确的排序。只做重定向本身很容易,我很确定我们已经涵盖了它。
-
(...和“棘手”,我的意思是,如果您需要完美的排序,您需要使用系统调用级别的跟踪来重建写入 会发生的顺序如果它们没有通过没有同步保证的不同长度的管道被重定向)。
-
@CharlesDuffy 是否可以使用
while和read逐行读取输入并确定哪些应该打印,哪些不应该打印? -
每个
read操作仅从一个文件描述符中读取。即使您使用以不同语言编写的代码和select()调用或其他方式同时收听多个 FD,但您仍然无法保证您的select()调用会收到相同的内容命令底层程序编写它。 -
(同理,每个
write()syscall 只写到一个文件描述符,这就是问题的根源。当stdout和stderr是同一个文件的两个不同副本时描述符,写入之间存在绝对顺序;但是一旦您希望它们单独处理,它们就不能再是同一个内核空间对象的副本,并且顺序变得未定义。
标签: bash io-redirection tee