我正在寻找一种方法来重定向交互式bash中的所有stderr流(理想情况下是调用其父进程)。
我不想从每个单独的命令重定向stderr流,我可以通过将2> a_file
附加到每个命令来完成。
默认情况下,这些stderr流被重定向到交互式bash的stdout。我想让他们在这个交互式bash进程的stderr上,以防止我的stdout被错误消息污染,并能够分开处理它们。
有什么想法吗?
我还没有找到答案......但也许它实际上是一个tty参数。有没有人知道关于处理stderr的tty / interactive shell责任?
答案 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)
两件事:
2>&1
会导致错误在本地tarfile中结束,从而导致“损坏”备份。我的建议是将远程端的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?