bash перенаправить stdout и stderr для разделения команд через ssh - PullRequest
2 голосов
/ 20 октября 2010

Я использую BASH 4. Я пытаюсь найти способ законно предварять вывод, чтобы указать тип вывода.Я могу сделать это с чем-то вроде этого ...

ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
stderr: ls: cannot access /tmp/abcdefgh: No such file or directory

ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
stdout: drwxr-xr-x 3 root root 4096 2010-10-15 09:08 fsck
stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 kernel
stdout: drwxr-xr-x 2 root root 4096 2010-09-10 06:01 temp_keys
...

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

Это выдаст вывод ...

ssh root@server1 "ls -l /tmp/ 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

Это не выдаст даже сообщение об ошибке ...

ssh root@server1 "ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

Однако, это показывает результаты статуса wget как результаты stderr (что и должно быть)

ssh root@server1 "wget http://server2/package.rpm 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')"

1 Ответ

2 голосов
/ 21 октября 2010

Я попробовал на своем компьютере следующее, не используя ssh:

$ ls asdfasdf 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')
$ stderr: ls: cannot access asdfasdf: No such file or directory

То, что $ во второй строке не является опечаткой.Эти команды sed выполняются исключительно в фоновом режиме.ls выдал сообщение об ошибке и закончил с достаточным количеством времени, чтобы оболочка вывела подсказку, прежде чем sed получил возможность что-либо вывести.Я думаю, что обратная сторона вашего ssh закрывает соединение до того, как поступит вывод sed.

Буферизация через подоболочку и труба могут работать лучше, потому что cat ожидает закрытия ввода, а не ожидания переднего планапроцесс до конца:

ssh root@server1 "(ls -l /tmp/abcdefgh 2> >(sed 's/^/stderr: /') 1> >(sed 's/^/stdout: /')) | cat"
...