我知道如何使用tee将aaa.sh的输出(标准输出)写入bbb。退出,同时仍然显示在终端中:
./aaa.sh | tee bbb.out
我现在如何将标准错误写入一个名为ccc的文件。退出,同时仍然显示它?
我知道如何使用tee将aaa.sh的输出(标准输出)写入bbb。退出,同时仍然显示在终端中:
./aaa.sh | tee bbb.out
我现在如何将标准错误写入一个名为ccc的文件。退出,同时仍然显示它?
当前回答
如果使用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)
其他回答
如果使用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)
以下将适用于KornShell (ksh),其中进程替代不可用,
# create a combined (standard input and standard output) collector
exec 3 <> combined.log
# stream standard error instead of standard output to tee, while draining all standard output to the collector
./aaa.sh 2>&1 1>&3 | tee -a stderr.log 1>&3
# cleanup collector
exec 3>&-
这里真正的技巧是2>&1 1>&3的序列,在我们的例子中,它将标准错误重定向到标准输出,并将标准输出重定向到文件描述符3。此时,标准误差和标准输出还没有结合起来。
实际上,标准错误(作为标准输入)被传递给tee, tee在那里将日志记录到stderr.log,并重定向到文件描述符3。
文件描述符3一直将其记录到combined。log。因此,combine .log包含标准输出和标准错误。
简单:
./aaa.sh 2>&1 | tee -a log
这只是简单地将标准错误重定向到标准输出,因此tee对日志和屏幕都进行回显。也许我遗漏了一些东西,因为其他的解看起来很复杂。
注意:从Bash版本4开始,你可以使用|&作为2>和1 |的缩写:
./aaa.sh |& tee -a 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