Как перенаправить все stderr в bash? - PullRequest
10 голосов
/ 27 августа 2008

Я ищу способ перенаправления всех потоков stderr в интерактивном bash (в идеале к вызывающему родительскому процессу).

Я не хочу перенаправлять поток stderr из каждой отдельной команды, что я могу сделать, добавив 2> a_file к каждой команде.

По умолчанию эти потоки stderr перенаправляются на стандартный вывод интерактивного bash. Я хотел бы получить их на stderr этого интерактивного процесса bash, чтобы предотвратить загрязнение моего stdout сообщениями об ошибках и иметь возможность обрабатывать их отдельно.

Есть идеи?

Я до сих пор не нашел ответ ... Но, может быть, это на самом деле параметр tty. Кто-нибудь знает что-нибудь об ответственности tty / интерактивной оболочки за обработку stderr?

Ответы [ 7 ]

9 голосов
/ 27 августа 2008

Используйте встроенный в exec bash:

exec 2> /tmp/myfile

4 голосов
/ 27 августа 2008

Вы можете запустить новый процесс bash, перенаправив stderr этого процесса:

  $ bash -i 2> stderr.log
  $ 
2 голосов
/ 07 августа 2013

Я считаю, что хорошим способом является окружение команд круглыми скобками, '()', (запустить под-оболочку) или фигурными скобками, '{}' (без под-оболочки; быстрее):

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

Конечно, это можно сделать в 1 строку:

{ cmd1; cmd2; ... cmdN; } 2> error.log
2 голосов
/ 11 ноября 2010

Две вещи:

  1. Использование 2>&1 в удаленной команде ssh приводит к ошибке, заканчивающейся в локальном tarfile, что приводит к «поврежденной» резервной копии.
  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
2 голосов
/ 17 сентября 2008

Я не вижу вашей проблемы, она работает как задумано:

$ ssh remotehost 'ls nosuchfile; ls /etc/passwd' >/tmp/stdout 2>/tmp/stderr 
$ cat /tmp/stdout  
/etc/passwd 
$ cat /tmp/stderr 
nosuchfile not found
2 голосов
/ 16 сентября 2008

Попробуйте свои команды в двойных кавычках, например:

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
0 голосов
/ 08 апреля 2009

Пробовал ssh -t создать псевдо-TTY на удаленном конце?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...