如何重定向bas​​h中的所有stderr?

时间:2020-03-05 18:43:49  来源:igfitidea点击:

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

我不想从每个命令中重定向stderr流,可以通过在每个命令后添加2> a_file来重定向。

默认情况下,这些stderr流被重定向到交互式bash的stdout。我希望将它们放在此交互式bash流程的stderr上,以防止错误消息污染我的stdout并能够将它们分开对待。

有任何想法吗?

我仍然没有找到答案。但是也许它实际上是一个tty参数。有人知道关于处理stderr的tty /交互式shell责任吗?

解决方案

回答

我们可以启动一个新的bash进程来重定向该进程的stderr:

$ bash -i 2> stderr.log
  $

回答

使用bash内置的exec

exec 2> / tmp / myfile

回答

尝试用双引号引起来的命令,如下所示:

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 remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout  
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found

回答

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

回答

两件事情:

  • 在远程ssh命令中使用2>&1会导致错误最终在本地tarfile中结束,从而导致"中断"的备份。
  • 如果要在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