【问题标题】:How to redirect all stderr in bash?如何在bash中重定向所有stderr?
【发布时间】:2010-09-07 00:02:24
【问题描述】:

我正在寻找一种方法来重定向交互式 bash 中的所有 stderr 流(最好是重定向到它的调用父进程)。

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

默认情况下,这些标准错误流被重定向到交互式 bash 的标准输出。我想将它们放在这个交互式 bash 进程的标准错误中,以防止我的标准输出被错误消息污染并能够单独处理它们。

有什么想法吗?

我还没有找到答案……但也许它实际上是一个 tty 参数。有人知道处理标准错误的 tty/交互式 shell 责任吗?

【问题讨论】:

  • 您在评论中提到了 python,您能否展示一下您用于创建这些 SSH 流的代码。你不使用popen/popen2/popen3吗?

标签: linux bash shell


【解决方案1】:

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

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

当然,这可以在 1 行中完成:

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

【讨论】:

    【解决方案2】:

    两件事:

    1. 在远程 ssh 命令中使用 2>&1 会导致错误最终出现在本地 tar 文件中,从而导致备份“损坏”。
    2. 如果您想在 ssh 的另一端应用重定向,请记住转义重定向命令。

    我的建议是将远程端的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
    

    【讨论】:

      【解决方案3】:

      试过ssh -t在远端创建一个伪TTY?

      【讨论】:

        【解决方案4】:

        我没有看到您的问题按设计工作:

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

        【讨论】:

          【解决方案5】:

          用双引号试试你的命令,像这样:

          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
          

          【讨论】:

          • 如果您在 ssh 之后直接键入命令,则不会在远程主机上加载 shell。命令直接通过 ssh 通道执行。我在 python 中使用 paramiko,但这是一样的。我的问题是我需要一个交互式 shell 来执行许多命令并且仍然获得标准错误。
          【解决方案6】:

          在 bash 中使用 exec 内置函数:

          exec 2> /tmp/myfile

          【讨论】:

            【解决方案7】:

            您可以启动一个新的 bash 进程来重定向该进程的标准错误:

              $ bash -i 2> stderr.log
              $ 
            

            【讨论】:

              猜你喜欢
              • 2015-02-04
              • 2010-10-01
              • 1970-01-01
              • 1970-01-01
              • 2010-09-30
              • 2012-03-09
              • 1970-01-01
              • 1970-01-01
              • 2021-01-28
              相关资源
              最近更新 更多