Здравствуйте, Pzz, Вы писали:
Pzz>большинство программ help в stdout печатают...
Которые встроены в линукс — само собой, от них такого авангардизма вряд ли потерпели бы. Я про самопальные.
Покопал свои завалы, нашел еще несколько (все собраны под винду): cdrecord, upx, syslinux, iperf3 (этот вообще красавчик — справку вываливает в stderr, а ошибку "parameter error" — в stdout).
В пакете UnxUtils под винду так ведут себя bzip2/bunzip2, compress, gawk (возможно, таких там еще немало). Эти вроде как портировались из родных юниксовых, еще до расцвета линуксов.
Здравствуйте, Евгений Музыченко, Вы писали:
N>>Если утилита участвует в pipe ты точно хочешь мусор на входе следующего этапа конвейера? ЕМ>Что именно считать "мусором", и почему?
Все что не в формате ожидаемого потребителем.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Покопал свои завалы, нашел еще несколько (все собраны под винду): cdrecord, upx, syslinux, iperf3 (этот вообще красавчик — справку вываливает в stderr, а ошибку "parameter error" — в stdout).
cdrecord, upx, syslinux — и впрямь.
iperf3 — починили (или попатчили в Федоре).
ЕМ>В пакете UnxUtils под винду так ведут себя bzip2/bunzip2, compress, gawk (возможно, таких там еще немало). Эти вроде как портировались из родных юниксовых, еще до расцвета линуксов.
В линухе тоже.
Про bzip2 это хоть понятно: для них штатбый режим — output в stdout вываливать, и логично больше stdout ни для чего не использовать. gawk тоже, наверное, в stdout гавкает результатами обработки, а всякими справками-муравками гавкает в stderr.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Почему изрядная часть unix-like утилит выводит справку в stderr?
ЕМ>На это есть какие-то разумные соглашения, или просто мода такая тупая?
Unix, и его клоны — это изначально операционные системы, заточенные, в основном на обработку текста. "Всё — есть файл", "утилита делает одну работы и делает её хорошо", "для сложных задач комбинируй простые утилиты через конвееры".
Так вот в конвеер справка попадать не должна — потребитель не знает как этот текст обработать, да ещё это переносит ошибку в другое место, что затрудняет отладку. Зато он знает что делать с ненулевым кодом выхода.
Это в винде везде произвол.
Здравствуйте, Marty, Вы писали:
M>Почему тупая? По мне так — вполне логично. В stdout выдаются результаты работы программы, а всякие служебные сообщения, об ошибках там, или та же справка — в stderr
Большая часть програм, о которых мы говорим, не выдают в stdout результаты работы.
Если справка длинная — её хочется в less. Если программа выводит её в stderr, приходится вспоминать каждый раз, как stderr в stdout перенаправляется. Бесит, аж жуть.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Это тоже криво. Таки терминал предполагает, что за ним сидит не такой дилетант, как за гуем, поэтому вываливать ему полную справку на каждую ошибку — явное и грубое неуважение. Особенно, когда справка объемная, и после ее вывода сообщения об ошибке уже нет.
Я обычно вываливаю полную справку если 1) пользователь не указал ни одного command-line аргумента и 2) их отсутствие является ошибкой.
Здравствуйте, Doom100500, Вы писали:
D>Так вот в конвеер справка попадать не должна — потребитель не знает как этот текст обработать
Если справка попала в конвейер, это значит, что это либо было запланировано составителем того конвейера, либо случилось что-то внеплановое (ошибка в командной строке, глюк утилиты и т.п.), а в этом случае в конвейер может попасть все, что угодно. Пытаться оправдать этим вывод справки в stderr выглядит очень коряво. Вряд ли Вы сумеете найти подобное "обоснование" от сколько-нибудь авторитетных апологетов unix way.
D>Это в винде везде произвол.
Вот как раз те консольные утилиты, что изначально писаны под винду, дружно выводят справку в stdout. Исключения очень редки. Произвол и бардак я вижу в основном среди утилит, которые пришли из unix/Linux.
Здравствуйте, Pzz, Вы писали:
Pzz>Я обычно вываливаю полную справку если 1) пользователь не указал ни одного command-line аргумента и 2) их отсутствие является ошибкой.
Я обычно так же.
Вообще, если внимательно проанализировать доводы, выдвинутые здесь сторонниками вывода справки в stderr, то все они содержат внутренние противоречия, поскольку основаны на субъективной, вкусовой интерпретации. Мне пока удалось найти лишь один объективный критерий — это ожидаемость/предсказуемость вывода. Текст справки, идущий в поток, полностью предсказуем (кроме редких утилит, которые любят вываливать различные подсказки, но в *nix это не поощряется), а по ключам -h/--help — еще и ожидаем. Для любых сообщений об ошибках нарушается или один критерий, или оба сразу.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Вообще, если внимательно проанализировать доводы, выдвинутые здесь сторонниками вывода справки в stderr, то все они содержат внутренние противоречия, поскольку основаны на субъективной, вкусовой интерпретации. Мне пока удалось найти лишь один объективный критерий — это ожидаемость/предсказуемость вывода. Текст справки, идущий в поток, полностью предсказуем (кроме редких утилит, которые любят вываливать различные подсказки, но в *nix это не поощряется), а по ключам -h/--help — еще и ожидаем. Для любых сообщений об ошибках нарушается или один критерий, или оба сразу.
Меня, кстати, поразила массовость этого явления, вывода справки в stderr. Как-то я раньше даже и не знал (но многие из упомянутых тобой утилит для меня — что-то, что используется раз в три года).
Всё же, бардак всегда спутник отсутствия ценрального управления, UNIX тому — наглядный пример.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Почему изрядная часть unix-like утилит выводит справку в stderr? ЕМ>На это есть какие-то разумные соглашения, или просто мода такая тупая?
Вывод данных в stdout.
Логи/ошибки в stderr. В том числе и справка, если она выводится в ответ на какие-то неправильные аргументы.
Но по ключу -h/--help справка должна идти в stdout однозначно, так как это и есть результат.
Если же по ключу -h/--help выводят в stderr, то это лентяи, которым впадлу было писать выбор потока для справки, или просто недалёкие.
Вообще, выводить справку в ответ на ошибку аргументов — это дичь. Надо просто ошибку выводить. Тогда справка всегда только по запросу и всегда только в stdout.
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Здравствуйте, Doom100500, Вы писали:
D>>Так вот в конвеер справка попадать не должна — потребитель не знает как этот текст обработать
ЕМ>Если справка попала в конвейер, это значит, что это либо было запланировано составителем того конвейера, либо случилось что-то внеплановое (ошибка в командной строке, глюк утилиты и т.п.), а в этом случае в конвейер может попасть все, что угодно. Пытаться оправдать этим вывод справки в stderr выглядит очень коряво. Вряд ли Вы сумеете найти подобное "обоснование" от сколько-нибудь авторитетных апологетов unix way.
Если в конвейер пихать всё, что угодно, особенно длинные тексты — это отрывает огромную дыру в безопасности таких конвейеров. Хорошей практикой считается закрывать такие дыры с обеих сторон. Поэтому тексты, для которых в кенвейере не предусмотренна обработка идут в stderr. Особенно произвольные и неформатированные тексты, которые могут меняться от версии к версии, в отличие от ожидаемого вывода.
Здравствуйте, andrey.desman, Вы писали:
AD>Логи/ошибки в stderr. В том числе и справка, если она выводится в ответ на какие-то неправильные аргументы.
То есть, когда справка является частью сообщения об ошибке, верно?
AD>Если же по ключу -h/--help выводят в stderr, то это лентяи, которым впадлу было писать выбор потока для справки, или просто недалёкие.
Я тут упоминал, что в коде встречается явное указание stderr при выводе справки, а не вываливание туда всего вывода.
AD>Вообще, выводить справку в ответ на ошибку аргументов — это дичь. Надо просто ошибку выводить. Тогда справка всегда только по запросу и всегда только в stdout.
Да, именно так. Вместе с сообщением об ошибке можно выводить подсказку — в том числе и о ключах -h/--help.
Здравствуйте, Doom100500, Вы писали:
D>Если в конвейер пихать всё, что угодно, особенно длинные тексты — это отрывает огромную дыру в безопасности таких конвейеров.
Какая еще "дыра в безопасности конвейеров", когда сама идея конвейера вообще никак не соотносится с идеей безопасности? Эта Ваша фраза — типичный пример наукообразной бессмыслицы.
D>Хорошей практикой считается закрывать такие дыры с обеих сторон.
Хорошей практикой считается не применять конвейеры и подобным им механизмы на стыках разных уровней привилегий, да и вообще везде, где требуется мало-мальски значимая ответственность. Административные скрипты, использующие конвейеры — это по определению костыль, работающий лишь до тех пор, пока обе стороны конвейера никто не трогает.
D>Поэтому тексты, для которых в кенвейере не предусмотренна обработка идут в stderr.
Вы сами-то поняли, что сказанули? Сообразите, что утверждение явно глупое, или разъяснить?
Здравствуйте, Pzz, Вы писали:
M>>Почему тупая? По мне так — вполне логично. В stdout выдаются результаты работы программы, а всякие служебные сообщения, об ошибках там, или та же справка — в stderr
Pzz>Большая часть програм, о которых мы говорим, не выдают в stdout результаты работы.
Ну. У меня сложилось впечатление, что в целом идеология такова, что если не задавать выходной файл (или задать что-то типа '-'), то результаты будут выводится в stdout, и это можно встроить в пайп.
Pzz>Если справка длинная — её хочется в less. Если программа выводит её в stderr, приходится вспоминать каждый раз, как stderr в stdout перенаправляется. Бесит, аж жуть.
Сто лет не было желания пользоваться каким-то less — по-моему терминалы сто лет как умеют прокручивать вывод, просто колёсиком мыши крутишь, и всё
Здравствуйте, Marty, Вы писали:
Pzz>>Большая часть програм, о которых мы говорим, не выдают в stdout результаты работы.
M>Ну. У меня сложилось впечатление, что в целом идеология такова, что если не задавать выходной файл (или задать что-то типа '-'), то результаты будут выводится в stdout, и это можно встроить в пайп.
А у меня сложилось впечатление, что каждый делает, как захотелось.
Pzz>>Если справка длинная — её хочется в less. Если программа выводит её в stderr, приходится вспоминать каждый раз, как stderr в stdout перенаправляется. Бесит, аж жуть.
M>Сто лет не было желания пользоваться каким-то less — по-моему терминалы сто лет как умеют прокручивать вывод, просто колёсиком мыши крутишь, и всё
До появление less был more. Он был не таким удобным, но он был примерно всегда.
Здравствуйте, Pzz, Вы писали:
Pzz>Про bzip2 это хоть понятно: для них штатбый режим — output в stdout вываливать, и логично больше stdout ни для чего не использовать. gawk тоже, наверное, в stdout гавкает результатами обработки, а всякими справками-муравками гавкает в stderr.
Я именно про эту "идеологию" и говорил
Pzz>Но cdrecord!
Просто использует устоявшиеся соглашения? Вероятно, автор решил, что если одни утилиты будут справку выводить в stderr, а другие — в stdout, то это будет, как минимум, странно и непривычно