如何重定向shell脚本的所有输出的副本?

时间:2014-07-11 03:32:05

标签: shell pipe stderr

我想重定向shell脚本的所有输出的副本,在脚本中有一些mount命令和一些echo。

如果我使用>> 2>&1,我无法从命令行看到输出 如果我使用| tee -a the_log_file 2>&1,我可以在命令行中获取所有输出,但是在the_log_file中,没有安装错误输出,例如mount.nfs: /mnt/folder is busy or already mounted,我也想要the_log_file

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:4)

你需要使用
command 2>&1 | tee -a the_log_file
而不是 command | tee -a the_log_file 2>&1

(如果你问我,你不需要将2>&1放在管道套管中的非直观位置,这非常不直观!))

有关详细信息,请参阅 Bash Hackers Wiki 中的 Illustrated Redirection Tutorial 复制文件描述符2>& 1 部分中的插图显示了我们的案例:

  ls /tmp/ doesnotexist 2>&1     |                   less

 ---       +--------------+              ---       +--------------+
( 0 ) ---->| /dev/pts/5   |     ------> ( 0 ) ---->|from the pipe |
 ---       +--------------+    /   --->  ---       +--------------+
                              /   /
 ---       +--------------+  /   /       ---       +--------------+
( 1 ) ---->| to the pipe  | /   /       ( 1 ) ---->|  /dev/pts    |
 ---       +--------------+    /         ---       +--------------+
                              /
 ---       +--------------+  /           ---       +--------------+
( 2 ) ---->|  to the pipe | /           ( 2 ) ---->| /dev/pts/    |
 ---       +--------------+              ---       +--------------+