我知道如何使用tee将aaa.sh的输出(标准输出)写入bbb。退出,同时仍然显示在终端中:
./aaa.sh | tee bbb.out
我现在如何将标准错误写入一个名为ccc的文件。退出,同时仍然显示它?
我知道如何使用tee将aaa.sh的输出(标准输出)写入bbb。退出,同时仍然显示在终端中:
./aaa.sh | tee bbb.out
我现在如何将标准错误写入一个名为ccc的文件。退出,同时仍然显示它?
当前回答
简单:
./aaa.sh 2>&1 | tee -a log
这只是简单地将标准错误重定向到标准输出,因此tee对日志和屏幕都进行回显。也许我遗漏了一些东西,因为其他的解看起来很复杂。
注意:从Bash版本4开始,你可以使用|&作为2>和1 |的缩写:
./aaa.sh |& tee -a log
其他回答
发送到标准错误(STDERR)的编译错误可以通过以下方法重定向或保存到文件:
Bash:
gcc temp.c &> error.log
C shell (csh)
% gcc temp.c |& tee error.log
参见:如何将编译/构建错误重定向到文件?
如果使用Bash:
# Redirect standard out and standard error separately
% cmd >stdout-redirect 2>stderr-redirect
# Redirect standard error and out together
% cmd >stdout-redirect 2>&1
# Merge standard error with standard out and pipe
% cmd 2>&1 |cmd2
信用(不回答从我的头顶)在这里:Re: bash: stderr & more(管道为stderr)
在我的例子中,一个脚本正在运行命令,同时将stdout和stderr重定向到一个文件,类似于:
cmd > log 2>&1
我需要更新它,以便在出现故障时,根据错误消息采取一些操作。当然,我可以删除dup 2>&1并从脚本中捕获stderr,但是错误消息不会进入日志文件以供参考。虽然从lhunath接受的答案应该做同样的事情,它将stdout和stderr重定向到不同的文件,这不是我想要的,但它帮助我提出了我需要的确切解决方案:
(cmd 2> >(tee /dev/stderr)) > log
通过上述操作,log将同时拥有标准输出和标准错误的副本,并且我可以从脚本中捕获标准错误,而不必担心标准错误。
如果你使用Z shell (zsh),你可以使用多个重定向,所以你甚至不需要tee:
./cmd 1>&1 2>&2 1>out_file 2>err_file
在这里,您只是将每个流重定向到自身和目标文件。
完整的示例
% (echo "out"; echo "err">/dev/stderr) 1>&1 2>&2 1>/tmp/out_file 2>/tmp/err_file
out
err
% cat /tmp/out_file
out
% cat /tmp/err_file
err
注意,这需要设置MULTIOS选项(这是默认设置)。
MULTIOS 当尝试多次重定向时执行隐式tee或cats(参见重定向)。
将标准错误重定向到一个文件,将标准输出显示到屏幕上,并将标准输出保存到一个文件:
./aaa.sh 2>ccc.out | tee ./bbb.out
要在屏幕上显示标准错误和标准输出,并将它们保存到文件中,您可以使用Bash的I/O重定向:
#!/bin/bash
# Create a new file descriptor 4, pointed at the file
# which will receive standard error.
exec 4<>ccc.out
# Also print the contents of this file to screen.
tail -f ccc.out &
# Run the command; tee standard output as normal, and send standard error
# to our file descriptor 4.
./aaa.sh 2>&4 | tee bbb.out
# Clean up: Close file descriptor 4 and kill tail -f.
exec 4>&-
kill %1