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?
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:
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ść.
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.
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.
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.
-q
do tłumienia wszystkich danych wyjściowych. Na przykład Docker ma polecenie wyświetlania obrazów;docker images
pokazuje sformatowaną tabelę z dużą ilością informacji, a jednocześniedocker images -q
wyświetla prostą listę identyfikatorów obrazów (przydatne do przesyłania strumieniowego do innych poleceń).Odpowiedzi:
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:
aby wydrukować rozmiar wszystkich plików, które zawierają
foo
. Jeśli przekierujesz do/dev/null
, stracisz obafind
igrep
dane 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
/dev/null
oznacza, ż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)grep
przykład, ponieważ z-q
,grep
wie , że dane wyjściowe nie są wymagane, kończy działanie, gdy tylko znajdzie pierwsze dopasowanie. Dziękigrep > /dev/null
nadal próbowałby znaleźć wszystkie dopasowania.-v|--verbose
). Na przykładmplayer
ma a--quiet
i a--really-quiet
. W przypadku niektórych poleceń możesz użyć-qqq
trzykrotnie zmniejszając gadatliwość.źródło
grep
obie opcje-q
, i-s
, są zalecane, aby unikać, jeśli przenośność stanowi problem.grep
wcześniejsze wyjście jest ważną optymalizacją, ale nie wszystkie programy z takimi opcjami mogą to zrobić;curl -s
nadal będzie przetwarzać całe dane (ale trzeci punkt nadal obowiązuje, co oszczędza czas przetwarzania).-q
i-s
są określone przez POSIX. Jeśli rozważymy systemy tak stare, moje teżsh -c '...' sh {} \;
nie będą działać (z wcześniejszymiksh
wersjamish
).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.
źródło
Chociaż prawdopodobnie zależy to od polecenia,
-q
również wyłącza wyjście dlastderr
. Pozwala to pociskom, które nie pozwalają łatwo zwielokrotnić stderr na standardowe wyjście (patrzę na ciebiecsh
itcsh
), 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
-q
lub wyciszyłby wszystkie dane wyjściowe statusu programu, umożliwiając czysty strumień danych z, powiedzmy,tar
lubgzip
.źródło
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.
źródło