Почему dos2unix печатает в stderr?

При запуске dos2unix в файле я получаю следующее, напечатанное на терминале

dos2unix: converting file <filename> to UNIX format ...

В моей попытке подавить вывод, отправив его в /dev/null, я заметил, что он отправляется на stderr вместо stdout, как я и ожидал (поскольку это похоже на обычное сообщение, а не на ошибку). Есть причина для этого?


person user1881282    schedule 13.07.2014    source источник
comment
Вы обнаружите, что unix наполнен историческими артефактами, например, почему dd требует аргументов, подобных if=..., и почему tar требует позиционных аргументов без начального -. Просто так оно и есть...   -  person Mark Lakata    schedule 13.07.2014
comment
Если вы еще не нашли его, вы можете подавить этот вывод, используя флаг --quiet   -  person ebo    schedule 13.07.2014
comment
Потому что скучно. Но в прошлом вы могли просто передавать в него ввод и передавать данные. Ошибки, которые необходимо поместить в stderr   -  person Ed Heal    schedule 13.07.2014


Ответы (5)


В Unix-подобных средах принято объединять процессы в цепочку: результат одной программы используется в качестве входных данных для другой программы. Смешивание результатов с диагностикой может привести к путанице на следующем этапе обработки. Это также скрыло бы диагностику от потенциального пользователя, наблюдающего за терминалом, где результаты обработки, переданные следующей программе, не отображаются.

Это причина разделения результатов и диагностики в stdout и stderr. Диагностика не ограничивается ошибками, но должна содержать все, что не является результатом обработки, ожидаемым последующими программами.

Что касается фактического вопроса: dos2unix часто используется для преобразования файлов на месте, но также может выводить на стандартный вывод (при вызове без имени файла он считывается со стандартного ввода и выводится на стандартный вывод). stdout может быть перенаправлен независимо от stderr. Рассмотрим cat blados | dos2unix > blaunix. Вы по-прежнему будете видеть диагностику (которая может содержать сообщения об ошибках!), но результат обработки будет отправлен на blaunix.

Не так уж часто вообще распечатывают диагностику в случае успеха, вероятно, небольшой поклон пользователям DOS. Было бы очень плохо, если бы результат обработки содержал информационное сообщение; например, это сломает файл C.

person Peter - Reinstate Monica    schedule 13.07.2014

Нет причин, но обычно stderr используется не только для вывода ошибок. Это еще один поток, который часто используется для регистрации или информационных сообщений. Так как сообщение журнала не выводится, оно не отправляется на stdout, то есть для результатов работы программы.

Причина, по которой он печатается на вашем терминале, является следствием вашей оболочки и не контролируется приложением.

person Burhan Khalid    schedule 13.07.2014
comment
Бьюсь об заклад, что dos2unix раньше выполнялся вручную с помощью tr -d '\r' < file > file2, и в этом случае stdin и stdout уже заняты. - person Mark Lakata; 13.07.2014

Try dos2unix -q <filename>

-q, --quiet Тихий режим. Подавить все предупреждения и сообщения. Возвращаемое значение равно нулю. За исключением случаев, когда используются неправильные параметры командной строки.

person kayle    schedule 30.08.2016

Просто потому, что так было реализовано...

Если вы посмотрите исходный код вы увидите:

...
if (!pFlag->Quiet)
    fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]);

...
person Nir Alfasi    schedule 13.07.2014
comment
А поскольку это бесплатное программное обеспечение, вы можете улучшить исходный код, чтобы он соответствовал вашим потребностям (но вы, вероятно, должны опубликовать ваши патчи...) - person Basile Starynkevitch; 13.07.2014
comment
Хотя, строго говоря, вопрос был не в том, реализовано ли это (это было очевидно), а в почему. В результате можно утверждать, что ваш ответ является не столько ответом, сколько подтверждением существования состояния. Тем не менее приятно посмотреть на это. - person Peter - Reinstate Monica; 25.01.2015

Я использую этот однострочник, чтобы перенаправить stderr на stdout, пропустить полученную первую нерелевантную строку и отправить остальную часть обратно в stderr.

dos2unix thefile 2>&1|tail -n+2 1>&2

person Rusty75    schedule 20.06.2016
comment
И именно зачем это делать? - person Peter - Reinstate Monica; 26.06.2018