【问题标题】:Redirecting bash stdout/stderr to two places?将 bash stdout/stderr 重定向到两个地方?
【发布时间】:2010-10-14 19:43:26
【问题描述】:

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

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

【问题讨论】:

标签: bash redirect


【解决方案1】:

您可以使用命名管道,这正是您所描述的情况。

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)

【讨论】:

  • Bash 的进程替换会一步完成(类似于“匿名命名管道”) command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)
  • 这只是标准输出而不是标准错误。
  • @Nils: 如果你用|&amp; 替换| 然后bash 重定向stdout/stderr。
【解决方案2】:

是否可以将 stdout 和 stderr 重定向到终端输出和程序?

我不确定在编辑器的输入中组合 stdout 和 stderr 有多大用处,但这样的事情是否能满足您的需求?

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

【讨论】:

  • Charles,“tee >/dev/tty”正确吗?我从来没有见过这样做的。我通常只会“tee /dev/tty”来获得你想要的效果。
  • @Pax @Charles Bailey 修复了错字。如果 tee> 是有意的,则回滚
  • 噢,是的,对不起。显然 stdout 不能同时被重定向和管道。谢谢。
  • 至少在Linux上,你也可以发到/dev/stdout/dev/stderr
【解决方案3】:

我实际上不知道TextMate 是否可以将要编辑的文件作为其标准输入,这似乎有点奇怪。我怀疑您想将 stdout/stderr 发送到一个文件并在那里进行编辑,在这种情况下您需要:

progname 2>&1 | tee tempfile ; textmate tempfile

2&gt;&amp;1stderr(文件句柄 2)重定向到与 stdout(文件句柄 1)相同的位置,以便它们最终都在一个流中。然后tee 命令将其写入tempfilestdout

然后,一旦该过程完成,就会在临时文件上调用编辑器。

如果它可以接受标准输入进行编辑,请使用:

progname 2>&1 | tee /dev/tty | textmate

【讨论】:

  • 管道任何要交配的东西都会在新文档中打开
猜你喜欢
  • 2017-12-17
  • 2014-07-22
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 2011-12-28
  • 2012-08-07
  • 2021-08-19
  • 1970-01-01
相关资源
最近更新 更多