Я ищу способ перенаправить все потоки stderr в интерактивном bash (в идеале на вызывающий родительский процесс).
Я не хочу перенаправлять поток stderr из каждой отдельной команды, что я мог бы сделать, добавив 2> a_file к каждой команде.
По умолчанию эти потоки stderr перенаправляются на стандартный вывод интерактивного bash. Я хотел бы получить их на stderr этого интерактивного процесса bash, чтобы предотвратить загрязнение моего stdout сообщениями об ошибках и иметь возможность обрабатывать их по отдельности.
Есть идеи?
Я до сих пор не нашел ответа ... Но, возможно, это действительно параметр tty. Кто-нибудь знает что-нибудь об ответственности tty / интерактивной оболочки за обработку stderr?





Вы можете запустить новый процесс 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, вы не загрузите оболочку на удаленном хосте. Команда выполняется напрямую через ssh-канал. Я использую paramiko в Python, но это то же самое. Моя проблема в том, что мне нужна интерактивная оболочка для выполнения многих команд и при этом получить stderr.
Я не вижу вашей проблемы, он работает так, как задумано:
$ 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 на удаленном конце?
Две вещи:
2>&1 в удаленной команде ssh приводит к тому, что ошибка попадает в локальный tar-файл, что приводит к «сломанной» резервной копии.Я предлагаю перенаправить 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
Я считаю, что хороший способ заключить команды в круглые скобки '()' (запуск вспомогательной оболочки) или фигурные скобки '{}' (без вспомогательной оболочки; быстрее):
{
cmd1
cmd2
...
cmdN
} 2> error.log
Конечно, это можно сделать в 1 строке:
{ cmd1; cmd2; ... cmdN; } 2> error.log
Вы упоминаете python в комментарии, не могли бы вы показать, какой код вы используете для создания этих SSH-потоков. Вы не используете popen / popen2 / popen3?