将bash的标准输出和错误输出重定向到两个位置?

39

这个问题困扰我有一段时间了。是否可以将 stdoutstderr 重定向到终端输出和一个程序?

我知道可以使用tee将输出重定向到文件和 stdout,但我希望它既能传输到一个程序(我的编辑器 [TextMate]),又能传输到终端输出… 这肯定是可能的(我知道在 zsh 中是可能的…)


请参见https://dev59.com/F3VD5IYBdhLWcg3wL4cA#60955。 - craq
3个回答

34
您可以使用命名管道,这是为您描述的情况而设计的。
mkfifo some_pipe
command_that_writes_to_stdout | tee some_pipe \
  & command_that_reads_from_stdin < some_pipe
rm some_pipe

或者,在Bash中:

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)

3
Bash的进程替换可以用一步完成这个操作(有点像“匿名命名管道”),将会把输出写入到标准输出并在同时传递给读取标准输入的命令,具体方法是: command_that_writes_to_stdout | tee >(command_that_reads_from_stdin) - oylenshpeegul
1
这只是标准输出(stdout),并非错误输出(stderr)。 - Nils
2
@Nils:如果你用|&代替|,那么bash会同时重定向标准输出和标准错误输出。 - jfs

21

如何将stdout和stderr同时重定向到终端输出和程序中?

我不确定将stdout和stderr合并后输入到编辑器是否有用,但是像这样做是否可以满足您的需求?

input_prog 2>&1 | tee /dev/tty | my_editor

1
Charles,"tee >/dev/tty" 这个命令正确吗?我从没见过这么写。通常情况下,我会直接使用 "tee /dev/tty" 实现你想要的效果。 - paxdiablo
@Pax @Charles Bailey 修正了拼写错误。如果 tee> 是有意的,请回滚。 - phihag
抱歉,stdout显然不能同时被重定向和管道传输。谢谢。 - CB Bailey
2
至少在Linux上,你也可以使用tee命令将输出分别重定向到/dev/stdout/dev/stderr - JasonSmith

2

实际上我并不确定TextMate是否可以将文件作为标准输入进行编辑,这似乎有些奇怪。我猜想你可能希望将stdout/stderr发送到一个文件中,并在那里进行编辑,此时您需要执行以下操作:

progname 2>&1 | tee tempfile ; textmate tempfile
2>&1将标准错误输出(文件句柄2)重定向到与标准输出(文件句柄1)相同的位置,使它们都进入单个流中。然后tee命令将其写入tempfile以及stdout
一旦进程完成,就会调用编辑器处理临时文件。
如果可以接受标准输入进行编辑,请使用:
progname 2>&1 | tee /dev/tty | textmate

将任何内容传输到 mate,它将在新文档中打开。 - obeattie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接