如何在将stderr显示到屏幕时将stdout和stderr重定向到文件?

时间:2014-08-18 03:39:26

标签: bash shell

脚本应将所有输出(stdout和stderr)重定向到日志文件,并仅向屏幕显示stderr(如果发生错误则通知用户)。命令tee可能会有所帮助,但不知道如何编写它。

感谢。

P.S。,感谢lihao和konsolebox的答案,但有没有办法保持输出有序。例如:

$ cat test.sh
echo "to stdout..1"
echo "to stderr..1" >&2
echo "to stdout..2"
echo "to stderr..2" >&2

$ sh test.sh 2>&1 >test.log | tee -a test.log
to stderr..1
to stderr..2

$ cat test.log
to stdout..1
to stdout..2
to stderr..1
to stderr..2

命令:{ sh test.sh 2> >(tee /dev/fd/4); } 4>&1 >test.log具有相同的输出。

2 个答案:

答案 0 :(得分:1)

以下内容如何:

cmd args 2>&1 >logfile | tee -a logfile

答案 1 :(得分:0)

您应该将普通标准输出映射到另一个文件描述符(4),使文件成为默认输出,然后使用tee通过/dev/fd将输出重定向到新文件描述符。当然,您需要进程替换才能将stderr输出传递给tee

{ cmd args 2> >(exec tee /dev/fd/4); } 4>&1 >file

如果要对脚本进行常规重定向,请将其放在脚本的开头:

exec 4>&1 >file 2> >(exec tee /dev/fd/4)

您可以使用以下命令恢复正常输出:

exec >&4 4>&-