Почему многие команды предоставляют «тихую» опцию?
37
Почему многие команды предоставляют опцию -qили --quietдля подавления вывода, когда вы можете легко добиться того же, перенаправив стандартный вывод в нулевой файл?
Не все команды используют -qдля подавления всех выходных данных. Например, в Docker есть команда для вывода списка изображений; docker imagesпоказывает отформатированную таблицу с кучей информации, а docker images -qвыводит простой список идентификаторов изображений (полезно для передачи в другие команды).
new123456
Ответы:
71
В то время как вы можете легко перенаправить в оболочке, существуют другие контексты, где это не так просто, например, при выполнении команды на другом языке без использования командной строки оболочки. Даже в оболочке
распечатать размер всех файлов, которые содержат foo. Если вы перенаправляете на /dev/null, вы теряете оба findи grepвывод. Вам нужно прибегнуть к -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(то есть, создать дополнительную оболочку).
grep -q foo короче тип grep foo > /dev/null
Перенаправление на /dev/nullозначает, что вывод все еще записывается, а затем отбрасывается, это менее эффективно, чем не записывать его (и не выделять, подготовить этот вывод для записи)
это позволяет дальнейшую оптимизацию. В случае, grepнапример, поскольку с -q, grepзнает, что вывод не требуется, он завершается, как только находит первое совпадение. При этом grep > /dev/nullон все равно попытался бы найти все совпадения.
тишина не обязательно означает молчание . Для некоторых команд это означает уменьшение многословия (противоположность -v|--verbose). Например, mplayerимеет --quietи --really-quiet. С некоторыми командами вы можете -qqqуменьшить многословность в 3 раза.
Следует отметить, что на grepстранице руководства рекомендуется избегать использования обоих вариантов, -qи -s, если речь идет о переносимости. grepранний выход - важная оптимизация, но не все программы с такими параметрами могут это сделать; curl -sбудет по-прежнему обрабатывать все данные (но 3-й пункт все еще применяется, тем самым экономя время обработки).
Янис
6
@Janis, это будет переносимость на очень старые системы. Оба -qи -sуказаны POSIX. Если мы рассмотрим старые системы, то моя sh -c '...' sh {} \;тоже не будет работать (с более ранними kshверсиями sh).
Стефан Шазелас
В справочной странице упоминается: в grep в стиле USG также отсутствует -q, но его опция -s ведет себя как GNU grep. - Я думал, что разница в поведении может быть проблемой. Я не могу судить о его актуальности.
Янис
Я часто использую опции -q и --quiet, когда меня волнует только код возврата команды в скрипте. Причины, упомянутые выше, являются еще лучшими примерами почему.
Марк Стюарт
@ StéphaneChazelas: вы будете удивлены тем, что (части) многих систем все еще так стары ... (ну, на самом деле, не так много ^^, но есть еще некоторые)
Оливье Дюлак
3
Это все еще позволяет команде выводить, когда она чувствует, что нуждается в примечании к экрану, но обычно это ничего не выдает. с перенаправлением всех на ноль нет никакой возможности увидеть результат.
Ну, тихо означает, что никакого ответа не ожидается; было бы неожиданно, если бы мы все равно увидели результат. (В случае, если в любом случае есть что-то «действительно действительно» важное для печати (в процессе, подключенном к терминалу), процесс может напрямую использовать устройство tty / pty. Примером этого может быть интерактивный запрос пароля или что-то подобное. )
Янис
2
Хотя это, вероятно, зависит от команды, -qтакже отключит вывод в stderr. Это позволяет оболочкам, которые не позволяют легко дублировать stderr в stdout (я смотрю на вас, csh& tcsh), чтобы избежать шума.
Некоторые программы предоставляют «тихий» параметр для ситуаций, когда он может иметь другой значимый вывод, который вы не хотите загромождать сообщениями о состоянии. -qИли эквивалент бы заглушить весь вывод состояния программы, что позволяет чистый поток данных, скажем, tarили gzip.
Помимо всех хороших отзывов и пунктов выше. Рекомендуется предоставлять противоположную опцию для каждого флага. Итак, если есть -v для многословия, то должно быть -q для не многословия, спокойствия или молчания. (это не предмет обсуждения, но ...) То же, что и длинный вариант для каждого короткого, -q и --quite.
Как и почти во всем в нашем бизнесе, есть много способов получить решение или те же результаты. Наличие -q является одним из них.
-q
для подавления всех выходных данных. Например, в Docker есть команда для вывода списка изображений;docker images
показывает отформатированную таблицу с кучей информации, аdocker images -q
выводит простой список идентификаторов изображений (полезно для передачи в другие команды).Ответы:
В то время как вы можете легко перенаправить в оболочке, существуют другие контексты, где это не так просто, например, при выполнении команды на другом языке без использования командной строки оболочки. Даже в оболочке
распечатать размер всех файлов, которые содержат
foo
. Если вы перенаправляете на/dev/null
, вы теряете обаfind
иgrep
вывод. Вам нужно прибегнуть к-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(то есть, создать дополнительную оболочку).grep -q foo
короче типgrep foo > /dev/null
/dev/null
означает, что вывод все еще записывается, а затем отбрасывается, это менее эффективно, чем не записывать его (и не выделять, подготовить этот вывод для записи)grep
например, поскольку с-q
,grep
знает, что вывод не требуется, он завершается, как только находит первое совпадение. При этомgrep > /dev/null
он все равно попытался бы найти все совпадения.-v|--verbose
). Например,mplayer
имеет--quiet
и--really-quiet
. С некоторыми командами вы можете-qqq
уменьшить многословность в 3 раза.источник
grep
странице руководства рекомендуется избегать использования обоих вариантов,-q
и-s
, если речь идет о переносимости.grep
ранний выход - важная оптимизация, но не все программы с такими параметрами могут это сделать;curl -s
будет по-прежнему обрабатывать все данные (но 3-й пункт все еще применяется, тем самым экономя время обработки).-q
и-s
указаны POSIX. Если мы рассмотрим старые системы, то мояsh -c '...' sh {} \;
тоже не будет работать (с более раннимиksh
версиямиsh
).Это все еще позволяет команде выводить, когда она чувствует, что нуждается в примечании к экрану, но обычно это ничего не выдает. с перенаправлением всех на ноль нет никакой возможности увидеть результат.
источник
Хотя это, вероятно, зависит от команды,
-q
также отключит вывод вstderr
. Это позволяет оболочкам, которые не позволяют легко дублировать stderr в stdout (я смотрю на вас,csh
&tcsh
), чтобы избежать шума.Некоторые программы предоставляют «тихий» параметр для ситуаций, когда он может иметь другой значимый вывод, который вы не хотите загромождать сообщениями о состоянии.
-q
Или эквивалент бы заглушить весь вывод состояния программы, что позволяет чистый поток данных, скажем,tar
илиgzip
.источник
Помимо всех хороших отзывов и пунктов выше. Рекомендуется предоставлять противоположную опцию для каждого флага. Итак, если есть -v для многословия, то должно быть -q для не многословия, спокойствия или молчания. (это не предмет обсуждения, но ...) То же, что и длинный вариант для каждого короткого, -q и --quite.
Как и почти во всем в нашем бизнесе, есть много способов получить решение или те же результаты. Наличие -q является одним из них.
источник