Bash 将stdout重定向到文件,并将stderr重定向到同一文件

Bash 将stdout重定向到文件,并将stderr重定向到同一文件,bash,io-redirection,tee,Bash,Io Redirection,Tee,我正在运行一个命令,该命令将(很可能)向stderr和stdout输出文本。我想将stderr和stdout保存到同一个文件中,但我只想将stderr打印到终端 我怎样才能让它工作?我尝试了mycommand 1>&2|tee file.txt>/dev/null,但这不会将任何内容打印到终端。如果您不需要完美的订购 使用tee的两个单独副本,两个副本都以附加模式写入同一个文件,但只有一个副本随后将内容转发到/dev/null,将使您到达需要的位置: mycommand \ 2> &g

我正在运行一个命令,该命令将(很可能)向stderr和stdout输出文本。我想将stderr和stdout保存到同一个文件中,但我只想将stderr打印到终端

我怎样才能让它工作?我尝试了
mycommand 1>&2|tee file.txt>/dev/null
,但这不会将任何内容打印到终端。

如果您不需要完美的订购 使用
tee
的两个单独副本,两个副本都以附加模式写入同一个文件,但只有一个副本随后将内容转发到
/dev/null
,将使您到达需要的位置:

mycommand \
  2> >(tee -a file.txt >&2) \
   > >(tee -a file.txt >/dev/null)

如果你确实需要完美的订购 如果您不需要完美订购,请参见 使用
tee
的两个单独副本,两个副本都以附加模式写入同一个文件,但只有一个副本随后将内容转发到
/dev/null
,将使您到达需要的位置:

mycommand \
  2> >(tee -a file.txt >&2) \
   > >(tee -a file.txt >/dev/null)

如果你确实需要完美的订购
请参见

这方面的棘手问题是保持准确的顺序。仅仅做重定向本身是很容易的,而且我很确定我们已经涵盖了它,我的意思是,如果您需要完美的顺序,您需要使用系统调用级别的跟踪来重建写入操作的顺序,如果它们没有通过不同长度的管道重定向,并且没有同步保证,那么写入操作将以什么样的顺序发生)@CharlesDuffy是否可以使用
while
read
逐行读取输入,并确定哪些应该打印,哪些不应该打印?每个
read
操作仅从一个文件描述符读取。即使您使用不同语言编写的代码与
select()
调用或其他方式同时侦听多个FD,您仍然无法保证
select()
调用接收内容的顺序与底层程序编写内容的顺序相同。(类似地,每个
write()
syscall只写入一个文件描述符,这是问题的根源。当stdout和stderr是同一个文件描述符的两个不同副本时,写入之间存在绝对顺序;但一旦您希望单独处理它们,它们就不能再是同一个kernelspace对象的副本,并且顺序变成u这件事的棘手之处在于保持准确的顺序。仅仅做重定向本身是很容易的,而且我很确定我们已经涵盖了它,我的意思是,如果您需要完美的顺序,您需要使用系统调用级别的跟踪来重建写入操作的顺序,如果它们没有通过不同长度的管道重定向,并且没有同步保证,那么写入操作将以什么样的顺序发生)@CharlesDuffy是否可以使用
while
read
逐行读取输入,并确定哪些应该打印,哪些不应该打印?每个
read
操作仅从一个文件描述符读取。即使您使用不同语言编写的代码与
select()
调用或其他方式同时侦听多个FD,您仍然无法保证
select()
调用接收内容的顺序与底层程序编写内容的顺序相同。(类似地,每个
write()
syscall只写入一个文件描述符,这是问题的根源。当stdout和stderr是同一个文件描述符的两个不同副本时,写入之间存在绝对顺序;但一旦您希望单独处理它们,它们就不能再是同一个kernelspace对象的副本,并且顺序变成u至少可以说,真是太遗憾了。我需要订购我的箱子。感谢您的帮助,如果您运行的底层程序是用Java编写的,那么log4j就是您的朋友;如果是Python,
日志记录
标准库模块,等等。如果正在运行的程序本身进行多路复用,它可以负责在内部保留顺序,只要配置为复制到同一文件,就会将来自log-stream-A的内容和来自log-stream-B的内容写入同一文件描述符(除了任何备用接收器的其他文件描述符)…但是,是的,这是一个遗憾;这意味着简单/干净的UNIX模型通常是不够的一个bash脚本,所以我想我从一开始就注定了不知道它的命运:如果它是你的脚本,你可以控制它如何记录日志。让你所有的信息日志通过一个可以配置的函数(可能是一个环境变量,但你对细节的调用)对不同的目的地进行两次单独的写入,这很好。至少可以说,这很遗憾。我的情况下确实需要订购。感谢您的帮助。如果您运行的底层程序是用Java编写的,log4j是您的朋友;如果是用Python编写的,则使用
日志记录
标准库模块,等等。如果程序是run如果多路复用本身不起作用,它可以负责在内部保留顺序,只要配置为复制到同一文件(以及任何备用接收器的其他文件描述符),就会将来自log-stream-A的内容和来自log-stream-B的内容写入同一文件描述符中…但是,是的,这是一个遗憾;这意味着简单/干净的UNIX模型通常是不够的。我正在编写(嗯,刚刚完成)一个bash脚本,所以我想我从一开始就注定了不知道它:如果它是你的脚本,你可以控制它如何进行日志记录。让你所有的信息日志通过一个可以配置的函数(可能有一个环境变量,但您需要调用详细信息)对不同的目的地进行两次单独的写入,这样做很好。