如何重定向bash中的所有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