脚本应将所有输出(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
具有相同的输出。
答案 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>&-