Определите, является ли вывод stdout или stderr


22

Как я могу определить, является ли процесс выводом stdout или stderr?

Ответы:


22

Есть только три способа, которые я знаю, чтобы определить, что программа выведет на STDOUT, а что на STDERR.

  1. Прочитайте документацию. Или

  2. Эксперимент с перенаправлением?

  3. печать STDERR красным

†Например:

program > program.stdout 2> program.stderr

Затем посмотрите на два выходных файла, чтобы увидеть, что программа записала в STDOUT и что она написала в STDERR.

Вместо перенаправления вы можете направить трубку, teeесли вам нужен вывод, чтобы перейти к экрану, а также в файл. См. Https://stackoverflow.com/q/692000/477035


15
Я обычно использую вариант 3: program | grep .печатает STDOUT красным.
Деннис

Печать в красном - это именно то, что я искал. Спасибо RedGrittyBrick & Dennis
Рауффл

7

На основании вашего комментария запроса:

{ { command; } 2>&3 | sed 's/^/STDOUT: /'; } 3>&1 1>&2 | sed 's/^/STDERR: /'

3
Выглядит впечатляюще. Но не могли бы вы добавить вишни к своему дереву и объяснить, что оно делает? Не все здесь являются гуру - и ваша конструкция довольно сложна;)
Иззи

Скобки для заказа. Я на самом деле получил эту точную форму из "я забыл-где", но смысл в том, чтобы использовать дополнительные файловые дескрипторы (кроме 1 = stdoutи 2 = stderr), чтобы получить вывод внутреннего набора скобок, и выполнить stdoutодну sedкоманду, пока stderrидет другой.
zebediah49

Вау. Не знал использовать эти дополнительные дескрипторы. Сначала я был немного смущен (мне нравится понимать, что я бегу - и меня немного путают с фигурными скобками). Но теперь понятно - ИМХО именно то, что хотел ОП. Так что +1 от меня :)
Иззи

Это помогло мне. Я хотел добавить больше данных в stderr. Это делает это и правильно выводит все обратно на stdout / stderr. { { { { echo "stdout" ; echo "stderr">&2; } 2>&3; } 3>&1 1>&2 | awk '{print "ERROR:",$0}' 1>&3; } 3>&2 2>&1; }
Брайан Дрюри

0

Вы можете просто перенаправить stderr в файл, и если в нем что-то появится, это из stderr.

например ls -a 2> ls-all.txt

если по какой-либо причине была отправлена ​​ошибка в stderr, она будет перенаправлена ​​в этот файл.


-1

Если вы хотите сделать это один раз, перенаправьте один из них в другое место.

Пример перенаправления стандарта с >.

ls -al> ls-l.txt (любой вывод здесь не из stdout, если вы видите что-то, это должен быть вывод stderr)

Для перенаправления stderr используйте 2>


Процесс создает постоянный поток вывода, некоторые для stdout, некоторые для stderr. Я хочу определить, какие именно, поскольку этот вывод идет на экран
Рауффл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.