Я наблюдаю за выводом моей сложной команды less
, проблема в том, что stderr
теряется. stderr
строки обычно перечисляются между stdout
строками внутри less
. Я хотел бы, чтобы они были напечатаны на консоли, и когда я выйду less
, чтобы увидеть их там вместе.
Я понимаю , что не может быть никакого решения этого, я прочитал о tee
и , multitee
но не везло до сих пор.
stderr
перенаправлено наstdout
, все выходные данныеstderr
будут смешаны с включенным обычным выходомstdout
. Трубопровод этого выходаless
покажет оба.less
чтобы перекрасить экран.Ответы:
Может быть
добавление
Ниже следует разъяснение для людей, которые не читают внимательно вопрос и не читают поясняющий комментарий ОП выше.
Хейликс указал:
и, в комментарии для первых ответивших, написал:
Проблема, вероятно, специфична для конкретной платформы, это то, что я испытывал на старых платформах Unix SVR4.
Если на таких платформах вы делаете что-то вроде
любые сообщения об ошибках (например, права доступа к каталогу) выглядят так, как показано ниже
так что выходные строки скрыты сообщениями об ошибках.
Если вы обновите страницу, выходные строки будут показаны правильно, но вы потеряете сообщения об ошибках. Когда вы выходите меньше, экран очищается, за исключением командной строки.
Если вы делаете что-то вроде
Сообщения об ошибках смешиваются со стандартным выводом. Опять же, когда вы выходите меньше, экран пуст.
Если вы хотите сначала просмотреть только стандартный вывод в less, а затем просмотреть сообщения об ошибках после выхода из less, вам нужно другое решение.
Это то, что я неуверенно предлагал в своем оригинальном ответе из двух строк.
источник
Вы должны перенаправить
stderr
наstdout
:Проверьте руководство для вашей оболочки (например
man bash
.)источник
$ ./somecommad |& less
просто скажите оболочке перенаправить fd 2 на fd 1 (stderr на stdout)
источник
Одна вещь, которой до сих пор не хватало во всех ответах, это причина, почему это происходит. Проблема здесь заключается в некотором состязании между процессом, выводящим данные на терминал
stderr
иless
отображающим выходные данныеstdout
на терминале. Еслиless
начинает отображаться после того, как все выходные данныеstderr
были распечатаны на терминале, тоless
сохраните это, и вы увидите сообщения после выходаless
. OTOH, еслиless
уже началось отображение материала, то сообщения об ошибках смешиваются сless
выходными данными, и послеless
выходов ничего не сохраняется (потому чтоless
просто сохраняет терминал, каким он был до его запуска, и ничего не знает о сообщениях об ошибках, появившихся между ними).Вы можете легко это увидеть, если, например,
Все сообщения об ошибках «Отказано в доступе» смешиваются с
less
выводом, и после выхода ничего не будет. Если вы делаетевсе (или, по крайней мере, большинство) сообщений об ошибках были напечатаны на терминале, прежде чем
less
появится возможность отобразить вывод, и вы увидите сообщения об ошибках позже.Конечно, обычно вы не хотите ждать 10 секунд перед тем, как начать
less
, но в Linux вы также можете указывать дробные значения времени ожидания, а при быстром запуске процессов часто чего-тоsleep 0.1
достаточно, чтобы избежать состояния гонки. (Но, конечно, если вы хотите или должны быть на самом деле в безопасности, используйте решение RedGrittyBrick).источник
Вам необходимо понять понятие «файловые дескрипторы». Обычно приложение unix запускается с тремя специальными файловыми дескрипторами:
«Труба»
|
в оболочке соединяетсяstdout
от одного процесса с другимstdin
.Ошибки - по замыслу - не передаются
stdin
в следующем процессе. Они часто не имеют смысла для следующего приложения и не должны быть скрыты от пользователя.Если вы хотите смешать ошибки в стандартный вывод, вы можете использовать, например
2>&1
, который говорит, по существу, «добавить stderr в стандартный вывод». Напримертакже должен включать вывод ошибок из недоступных файлов.
даст вам только ошибки.
источник
Я запутался в вашем вопросе, поскольку я могу сказать, что желаемое поведение по умолчанию.
Когда я использую
чтобы получить простой тест,
делает только то, что вы просите. Это я вижу
в
less
икогда я ухожу
less
источник
echo info ; echo error 1>&2
) и повторите тест: обе строки передаются меньше.Я случайно столкнулся с этой проблемой в одном из моих Debian 5.0 недавно. например, ls abc | Чем меньше я нахожу, что сообщение об ошибке идет в меньше, что вопреки моим знаниям.
После некоторых попыток я обнаружил, что это просто что-то, связанное с экранными буферами. На самом деле stderr НЕ входит в меньшее. Вы можете использовать стрелки вверх или вниз (или j / k) для демонстрации.
источник