Чому багато команд надають "тихий" варіант?


37

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


3
Я вважаю це переважно прапором зручності.
Яніс

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має a --quietі a --really-quiet. За допомогою деяких команд ви можете -qqqзменшити багатослівність у 3 рази.

Примітно, що на grepсторінці вручну обидва варіанти -q, і -s, пропонується уникати, якщо переносимість викликає занепокоєння. grepранній вихід - важлива оптимізація, але не всі програми з такими опціями можуть це зробити;curl -sвсе одно буде оброблятися всі дані (але 3-й пункт все ще застосовується, тим самим економлячи час обробки)
Яніс

6
@Janis, це буде портативність для дуже старих систем. І те, -qі -sінше визначено POSIX. Якщо ми вважатимемо старі системи, то і мої sh -c '...' sh {} \;не працюватимуть (з попередніми kshбазовими системами sh).
Стефан Шазелас

На сторінці чоловіка згадується: грепу в стилі USG також не вистачало -q, але його -s варіант поводився як GNU grep. - Я думав, що різниця в поведінці може бути проблемою. Я не можу судити про її актуальність.
Яніс

Я часто використовую параметри -q та --quiet, коли мені цікаво лише повернення коду команди в скрипті. Причини, зазначені вище, ще кращі приклади.
Марк Стюарт

@ StéphaneChazelas: Ви були б вражені тим, як (частини) багатьох систем все ще такі старі ... (ну, насправді, не так багато ^^, але є ще деякі)
Олів'є Дулак,

3

Він все ще дозволяє команді видавати, коли відчуває, що потрібно робити нотатку на екрані, але зазвичай нічого не видає. при переадресації всіх на нуль немає шансів, щоб результат був помічений.


Ну, тиша означає, що ніякої реакції не очікується; було б несподівано, якби ми все-таки побачили вихід. (У випадку, якщо в будь-якому випадку є щось, що "дійсно дійсно дійсно" важливо для друку (в терміналі, приєднаному до нього), процес може використовувати безпосередньо tty / pty пристрій. Прикладом цього може бути інтерактивний запит пароля або щось таке. )
Яніс

2

Хоча це, мабуть, залежить від команди, -qтакож відключить вихід stderr. Це дозволяє оболонкам, які не дозволяють легко копіювати stderr до stdout (я дивлюся на вас, csh& tcsh), щоб уникнути шуму.

Деякі програми пропонують "тихий" варіант для ситуацій, коли він може мати інший змістовний висновок, який ви не хочете переповнювати повідомленнями про стан. -qАбо еквівалент б заглушити весь висновок стану програми, що дозволяє чистий потік даних, скажімо, tarабо gzip.


0

Окрім усіх хороших відповідей та пунктів вище. Найкраща практика - передбачити протилежний варіант для кожного прапора. Отже, якщо є -v для багатослівності, повинно бути -q для неверботизму, цілком або мовчання. (це не сенс обговорення, але ...) Те саме, що має бути довгим варіантом для кожного короткого, -q та --quite.

Як і майже в усьому нашому бізнесі, існує багато способів отримати рішення або ті ж результати. Маючи -q - це одна з них.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.