10

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

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

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

有任何想法吗?

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

4

7 回答 7

10

使用exec内置的 bash:

exec 2> /tmp/myfile

于 2008-08-27T13:28:17.687 回答
4

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

  $ bash -i 2> stderr.log
  $ 
于 2008-08-27T13:27:48.217 回答
2

Try your commands in doublequotes, like so:

ssh remotehost "command" 2>~/stderr

Tested on my local system using a nonexistant file on the remote host.

$ 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
于 2008-09-16T18:00:37.473 回答
2

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

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout  
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found
于 2008-09-17T15:23:52.943 回答
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
于 2010-11-11T17:43:52.723 回答
2

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

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

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

{ cmd1; cmd2; ... cmdN; } 2> error.log
于 2013-08-07T02:04:45.327 回答
0

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

于 2009-04-08T19:39:07.767 回答