将bash的stdout/stderr重定向到两个位置?
将bash的stdout/stderr重定向到两个位置?
最近这个问题一直困扰着我。是否有可能将stdout
和stderr
同时重定向到终端输出和一个程序中?
我知道可以使用tee
将输出重定向到文件和stdout
,但我想同时将其发送到一个程序(我的编辑器[TextMate])和终端输出...肯定是有可能的(我知道zsh可以实现...)
问题:如何将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的输出目标,以实现相同的效果。
问题的原因是需要将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重定向到两个不同位置的解决方法。通过这些方法,可以将输出结果写入到文件或者通过管道传递给编辑器进行处理。
问题:如何将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重定向到两个不同位置的问题。