bash:将 stderr 重定向到文件并将 stdout + stderr 重定向到屏幕

lin*_*guy 12 linux bash pipe io-redirection stdout

我想将命令的 stderr 流保存到日志文件中,但我也想在屏幕上显示整个输出 (stdout + stderr)。我怎样才能做到这一点?

我只找到了将 stdout + stderr 显示到控制台并将两个流重定向到文件的解决方案:

 foo | tee output.file
Run Code Online (Sandbox Code Playgroud)

/sf/ask/29322751/

但我只想将 stderr 重定向到日志文件。

ica*_*rus 11

使用最近的 bash,您可以使用进程替换。

foo 2> >(tee stderr.txt)
Run Code Online (Sandbox Code Playgroud)

这只是将 stderr 发送到运行 tee 的程序。

更便携

exec 3>&1 
foo 2>&1 >&3 | tee stderr.txt
Run Code Online (Sandbox Code Playgroud)

这使得文件描述符 3 成为当前标准输出(即屏幕)的副本,然后设置管道并运行foo 2>&1 >&3。这会将 foo 的 stderr 发送到与当前 stdout 相同的位置,即管道,然后将 stdout 发送到 fd 3,即原始输出。管道将 foo 的原始 stderr 提供给 tee,tee 将其保存在文件中并将其发送到屏幕。