Почему многие команды предоставляют «тихую» опцию?

37

Почему многие команды предоставляют опцию -qили --quietдля подавления вывода, когда вы можете легко добиться того же, перенаправив стандартный вывод в нулевой файл?

Август Карлстрем
источник
3
Я считаю это главным образом удобным флагом.
Janis
7
Не все команды используют -qдля подавления всех выходных данных. Например, в Docker есть команда для вывода списка изображений; docker imagesпоказывает отформатированную таблицу с кучей информации, а docker images -qвыводит простой список идентификаторов изображений (полезно для передачи в другие команды).
new123456

Ответы:

71
  • В то время как вы можете легко перенаправить в оболочке, существуют другие контексты, где это не так просто, например, при выполнении команды на другом языке без использования командной строки оболочки. Даже в оболочке

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    распечатать размер всех файлов, которые содержат 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

Это все еще позволяет команде выводить, когда она чувствует, что нуждается в примечании к экрану, но обычно это ничего не выдает. с перенаправлением всех на ноль нет никакой возможности увидеть результат.

LhasaDad
источник
Ну, тихо означает, что никакого ответа не ожидается; было бы неожиданно, если бы мы все равно увидели результат. (В случае, если в любом случае есть что-то «действительно действительно» важное для печати (в процессе, подключенном к терминалу), процесс может напрямую использовать устройство tty / pty. Примером этого может быть интерактивный запрос пароля или что-то подобное. )
Янис
2

Хотя это, вероятно, зависит от команды, -qтакже отключит вывод в stderr. Это позволяет оболочкам, которые не позволяют легко дублировать stderr в stdout (я смотрю на вас, csh& tcsh), чтобы избежать шума.

Некоторые программы предоставляют «тихий» параметр для ситуаций, когда он может иметь другой значимый вывод, который вы не хотите загромождать сообщениями о состоянии. -qИли эквивалент бы заглушить весь вывод состояния программы, что позволяет чистый поток данных, скажем, tarили gzip.

Джо Сьюэлл
источник
0

Помимо всех хороших отзывов и пунктов выше. Рекомендуется предоставлять противоположную опцию для каждого флага. Итак, если есть -v для многословия, то должно быть -q для не многословия, спокойствия или молчания. (это не предмет обсуждения, но ...) То же, что и длинный вариант для каждого короткого, -q и --quite.

Как и почти во всем в нашем бизнесе, есть много способов получить решение или те же результаты. Наличие -q является одним из них.

Johandry
источник