如何在bash中重定向所有stderr?

时间:2008-08-27 13:19:17

标签: linux bash shell

我正在寻找一种方法来重定向交互式bash中的所有stderr流(理想情况下是调用其父进程)。

我不想从每个单独的命令重定向stderr流,我可以通过将2> a_file附加到每个命令来完成。

默认情况下,这些stderr流被重定向到交互式bash的stdout。我想让他们在这个交互式bash进程的stderr上,以防止我的stdout被错误消息污染,并能够分开处理它们。

有什么想法吗?

我还没有找到答案......但也许它实际上是一个tty参数。有没有人知道关于处理stderr的tty / interactive shell责任?

7 个答案:

答案 0 :(得分:9)

在bash中使用exec内置:

exec 2> /tmp/myfile

答案 1 :(得分:4)

您可以启动一个新的bash流程,重定向该流程的stderr:

  $ bash -i 2> stderr.log
  $ 

答案 2 :(得分:2)

用双引号试试你的命令,如下所示:

ssh remotehost "command" 2>~/stderr

使用远程主机上不存在的文件在我的本地系统上测试。

$ ssh remotehost "tail x;head x" 2>~/stderr
$ cat stderr 
tail: cannot open `x' for reading: No such file or directory
head: cannot open `x' for reading: No such file or directory

答案 3 :(得分:2)

我没有看到你的问题按设计运作:

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout  
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found

答案 4 :(得分:2)

两件事:

  1. 在远程ssh命令中使用2>&1会导致错误在本地tarfile中结束,从而导致“损坏”备份。
  2. 如果要在ssh的另一侧应用重定向,请记住转义重定向命令。
  3. 我的建议是将远程端的stderr重定向到文件,如果出现错误,请稍后再将其取出。

    示例:

    ssh -t remotehost tar -cf - /mnt/backup 2\>backup.err > localbackup.tar
    EXITSTATUS=$?
    if [ $EXITSTATUS != "0" ] then 
      echo Error occurred!
      ssh remotehost cat backup.err >localbackup.errors
      cat localbackup.errors
      ssh remotehost rm backup.err 
    else 
      echo Backup completed successfully!
      ssh remotehost rm backup.err 
    fi
    

答案 5 :(得分:2)

我发现一个好方法是用括号围绕命令,'()',(启动子shell)或花括号,' {}' (没有子壳;更快):

{
  cmd1
  cmd2
  ...
  cmdN
} 2> error.log

当然,这可以在一行完成:

{ cmd1; cmd2; ... cmdN; } 2> error.log

答案 6 :(得分:0)

尝试ssh -t在远程端创建伪TTY?