将bash的stdout/stderr重定向到两个位置?

11 浏览
0 Comments

将bash的stdout/stderr重定向到两个位置?

最近这个问题一直困扰着我。是否有可能将stdoutstderr同时重定向到终端输出和一个程序中?

我知道可以使用tee将输出重定向到文件和stdout,但我想同时将其发送到一个程序(我的编辑器[TextMate])和终端输出...肯定是有可能的(我知道zsh可以实现...)

0
0 Comments

问题:如何将stdout和stderr重定向到终端输出和程序中?

原因:用户想要将stdout和stderr的内容同时输出到终端和一个程序中。

解决方法:使用tee命令将stdout和stderr输出到终端,并通过管道将输出传递给其他程序。具体的解决方法如下:

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

注意事项:tee命令用于在终端和文件之间复制输入。在这种情况下,我们将stdout和stderr复制到终端,并将其传递给my_editor程序。

另外,也可以使用/dev/stdout/dev/stderr作为tee的输出目标,以实现相同的效果。

0
0 Comments

问题的原因是需要将stdout和stderr重定向到不同的位置。解决方法是使用重定向符号将stderr重定向到stdout,然后使用tee命令将stdout写入到一个临时文件中。然后,在进程结束后,调用编辑器textmate打开临时文件。

如果编辑器可以接受标准输入进行编辑,则可以使用另一种方法。将stderr重定向到stdout,然后再将stdout通过管道传递给textmate命令。

具体的解决方法如下:

progname 2>&1 | tee tempfile ; textmate tempfile

或者:

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

以上是将stdout和stderr重定向到两个不同位置的解决方法。通过这些方法,可以将输出结果写入到文件或者通过管道传递给编辑器进行处理。

0
0 Comments

问题:如何将bash的stdout和stderr重定向到两个不同的位置?

原因:该问题的出现是因为在bash中,如果只使用标准的重定向操作符(>和2>),只能将stdout或stderr重定向到一个地方,无法同时重定向到两个不同的地方。

解决方法:有两种解决方法可以实现将stdout和stderr同时重定向到两个不同的地方。

方法一:使用命名管道(named pipe)

mkfifo some_pipe
command_that_writes_to_stdout | tee some_pipe \
  & command_that_reads_from_stdin < some_pipe
rm some_pipe

该方法使用了一个命名管道(named pipe),即一个特殊的文件类型,用于实现进程间通信。首先使用`mkfifo`命令创建一个命名管道,然后将stdout通过`tee`命令写入到命名管道中,接着使用`command_that_reads_from_stdin`命令从命名管道中读取内容。最后,使用`rm`命令删除命名管道。

方法二:使用Bash的进程替换(process substitution)

command_that_writes_to_stdout | tee >(command_that_reads_from_stdin)

该方法使用Bash的进程替换功能,即将一个命令的输出作为另一个命令的输入。通过将`command_that_reads_from_stdin`命令放在尖括号中,并在前面加上`>`符号,即可将`command_that_writes_to_stdout`命令的stdout重定向到`command_that_reads_from_stdin`命令。

需要注意的是,以上两种方法只能将stdout重定向到两个不同的地方,无法同时重定向stdout和stderr。如果需要同时重定向stdout和stderr,可以将`|`替换为`|&`。

以上两种方法可以解决将bash的stdout和stderr重定向到两个不同位置的问题。

0