linux - экран - Как перенаправить все stderr в bash?




перенаправление ввода вывода си (5)

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

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

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

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

Есть идеи?

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


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

  $ bash -i 2> stderr.log
  $ 

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

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

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

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

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

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




shell