Dlaczego wiele poleceń zapewnia opcję „cichej”?

37

Dlaczego wiele poleceń udostępnia opcję -qlub --quiettłumi dane wyjściowe, skoro można łatwo osiągnąć to samo, przekierowując standardowe dane wyjściowe do pliku zerowego?

August Karlstrom
źródło
3
Uważam to głównie za wygodę.
Janis,
7
Nie wszystkie polecenia służą -qdo tłumienia wszystkich danych wyjściowych. Na przykład Docker ma polecenie wyświetlania obrazów; docker imagespokazuje sformatowaną tabelę z dużą ilością informacji, a jednocześnie docker images -qwyświetla prostą listę identyfikatorów obrazów (przydatne do przesyłania strumieniowego do innych poleceń).
new123456

Odpowiedzi:

71
  • Chociaż można łatwo przekierować w powłoce, istnieją inne konteksty, w których nie jest to tak łatwe, na przykład podczas wykonywania polecenia w innym języku bez korzystania z wiersza polecenia powłoki. Nawet w skorupce:

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

    aby wydrukować rozmiar wszystkich plików, które zawierają foo. Jeśli przekierujesz do /dev/null, stracisz oba findi grepdane wyjściowe. Trzeba będzie skorzystać z -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(tzn. Spawnować dodatkową powłokę).

  • grep -q foo jest krótszy do wpisania niż grep foo > /dev/null
  • Przekierowanie do /dev/nulloznacza, że ​​dane wyjściowe są nadal zapisywane, a następnie odrzucane, co jest mniej wydajne niż nie zapisywanie ich (i nie przydzielanie, przygotowanie danych wyjściowych do zapisu)
  • który pozwala na dalsze optymalizacje. Na grepprzykład, ponieważ z -q, grepwie , że dane wyjściowe nie są wymagane, kończy działanie, gdy tylko znajdzie pierwsze dopasowanie. Dzięki grep > /dev/nullnadal próbowałby znaleźć wszystkie dopasowania.
  • cisza niekoniecznie oznacza milczenie . W przypadku niektórych poleceń oznacza to zmniejszenie gadatliwości (w przeciwieństwie do -v|--verbose). Na przykład mplayerma a --quieti a --really-quiet. W przypadku niektórych poleceń możesz użyć -qqqtrzykrotnie zmniejszając gadatliwość.
Stéphane Chazelas
źródło
Warto zauważyć, że na stronie podręcznika grepobie opcje -q, i -s, są zalecane, aby unikać, jeśli przenośność stanowi problem. grepwcześniejsze wyjście jest ważną optymalizacją, ale nie wszystkie programy z takimi opcjami mogą to zrobić; curl -snadal będzie przetwarzać całe dane (ale trzeci punkt nadal obowiązuje, co oszczędza czas przetwarzania).
Janis,
6
@Janis, byłaby to przenośność na bardzo stare systemy. Zarówno -qi -ssą określone przez POSIX. Jeśli rozważymy systemy tak stare, moje też sh -c '...' sh {} \;nie będą działać (z wcześniejszymi kshwersjami sh).
Stéphane Chazelas,
Strona podręcznika wspomina: grep w stylu USG również nie miał -q, ale jego opcja -s zachowywała się jak grep GNU. - Myślałem, że różnica w zachowaniu może stanowić problem. Nie mogę oceniać jego znaczenia.
Janis,
Często używam opcji -q i --quiet, gdy zależy mi tylko na kodzie zwrotnym polecenia w skrypcie. Powody wymienione powyżej są jeszcze lepszymi przykładami dlaczego.
Mark Stewart
@ StéphaneChazelas: zdziwiłbyś się, jak wiele części jest wciąż tak starych ... (właściwie nie tak wiele ^^, ale wciąż jest kilka)
Olivier Dulac
3

Nadal pozwala wydać polecenie, kiedy wydaje mu się, że potrzebuje nuty na ekranie, ale zwykle nic nie gasi. z przekierowaniem wszystkich na zero, nie ma szans na wyświetlenie wyniku.

LhasaDad
źródło
Cicha oznacza, że ​​nie oczekuje się żadnej reakcji; byłoby i tak nieoczekiwane, gdybyśmy i tak zobaczyli wyniki. (W przypadku, gdy w ogóle istnieje coś „naprawdę naprawdę” ważnego do wydrukowania (w procesie podłączonym do terminala), urządzenie może bezpośrednio używać urządzenia tty / pty. Przykładem może być interaktywne zapytanie o hasło lub coś takiego. )
Janis,
2

Chociaż prawdopodobnie zależy to od polecenia, -qrównież wyłącza wyjście dla stderr. Pozwala to pociskom, które nie pozwalają łatwo zwielokrotnić stderr na standardowe wyjście (patrzę na ciebie cshi tcsh), aby uniknąć hałasu.

Niektóre programy zapewniają opcję „cichej” w sytuacjach, w których może mieć inne znaczące dane wyjściowe, które nie powinny być zaśmiecone komunikatami o stanie. Odpowiednik -qlub wyciszyłby wszystkie dane wyjściowe statusu programu, umożliwiając czysty strumień danych z, powiedzmy, tarlub gzip.

Joe Sewell
źródło
0

Oprócz wszystkich dobrych odpowiedzi i punktów powyżej. Najlepszą praktyką jest zapewnienie przeciwnej opcji dla każdej flagi. Tak więc, jeśli istnieje -v dla gadatliwości, powinno być -q dla nieokreśloności, spokoju lub ciszy. (nie o to chodzi w dyskusji, ale ...) To samo powinno być długą opcją dla każdego krótkiego, -q i --quite.

Podobnie jak w prawie wszystkim w naszej branży, istnieje wiele sposobów na uzyskanie rozwiązania lub takich samych rezultatów. Posiadanie -q jest jednym z nich.

Johandry
źródło