Warum bieten viele Befehle die Option -qoder --quietdie Unterdrückung der Ausgabe an, wenn Sie auf einfache Weise dasselbe erreichen können, indem Sie die Standardausgabe in die Nulldatei umleiten?
Nicht alle Befehle -qunterdrücken alle Ausgaben. Docker verfügt beispielsweise über einen Befehl zum Auflisten von Bildern. docker imagesZeigt eine formatierte Tabelle mit einer Reihe von Informationen an, während docker images -qeine einfache Liste von Bild-IDs ausgegeben wird (nützlich zum Weiterleiten an andere Befehle).
new123456
Antworten:
71
Während Sie in einer Shell leicht umleiten können, gibt es andere Kontexte, in denen es nicht so einfach ist, wie wenn Sie den Befehl in einer anderen Sprache ausführen, ohne eine Shell-Befehlszeile zu verwenden. Auch in einer Schale:
um die Größe aller enthaltenen Dateien zu drucken foo. Wenn Sie zu umleiten /dev/null, verlieren Sie beide findund die grepAusgabe. Sie müssten darauf zurückgreifen -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(das heißt, eine zusätzliche Shell erzeugen).
grep -q foo ist kürzer als grep foo > /dev/null
Umleiten auf /dev/nullbedeutet, dass die Ausgabe noch geschrieben und dann verworfen wird. Dies ist weniger effizient, als sie nicht zu schreiben.
das ermöglicht weitere optimierungen. Wenn grepzum Beispiel mit, bekannt ist -q, grepdass die Ausgabe nicht erforderlich ist, wird sie beendet, sobald die erste Übereinstimmung gefunden wird. Mit grep > /dev/nullwürde es immer noch versuchen, alle Übereinstimmungen zu finden.
leise heißt nicht unbedingt leise . Bei einigen Befehlen bedeutet dies, die Ausführlichkeit zu reduzieren (das Gegenteil von -v|--verbose). Zum Beispiel mplayerhat a --quietund a --really-quiet. Mit einigen Befehlen können Sie die -qqqAusführlichkeit dreimal verringern.
Es ist bemerkenswert, dass in der grepManpage vorgeschlagen wird, beide Optionen, -qund -s, zu vermeiden, wenn Portabilität ein Problem darstellt. grepDas vorzeitige Beenden ist eine wichtige Optimierung, aber nicht alle Programme mit solchen Optionen können dies. curl -sverarbeitet weiterhin die gesamten Daten (der dritte Punkt gilt jedoch weiterhin, wodurch Verarbeitungszeit gespart wird).
Janis
6
@ Janis, das wäre Portabilität auf sehr alte Systeme. Beide -qund -swerden von POSIX angegeben. Wenn wir Systeme in Betracht ziehen, die so alt sind, sh -c '...' sh {} \;funktionieren meine auch nicht (mit früheren kshbasierten shs).
Stéphane Chazelas
In der Manpage heißt es: Auch in USG-artigem grep fehlte -q, aber die Option -s verhielt sich wie in GNU grep. - Ich dachte, dass der Unterschied im Verhalten ein Problem sein könnte. Ich kann die Relevanz nicht beurteilen.
Janis
Ich verwende häufig die Optionen -q und --quiet, wenn mir nur der Rückkehrcode eines Befehls in einem Skript wichtig ist. Die oben genannten Gründe sind noch bessere Beispiele dafür.
Mark Stewart
@ StéphaneChazelas: Sie erstaunt sein würde , wie (Teile der) viele Systeme nach wie vor, dass alte ... (na ja, eigentlich nicht so viele ^^ aber es gibt noch einige)
Olivier Dulac
3
Der Befehl kann immer noch ausgegeben werden, wenn er das Gefühl hat, eine Notiz auf dem Bildschirm zu benötigen, aber normalerweise wird nichts ausgegeben. Wenn Sie all auf null umleiten, ist die Ausgabe nicht sichtbar.
Nun, leise bedeutet, dass keine Antwort erwartet wird. Es wäre unerwartet, wenn wir trotzdem eine Ausgabe sehen würden. (Für den Fall, dass es sowieso etwas "wirklich wirklich wirklich" Wichtiges zum Drucken gibt (in einem an ein Terminal angeschlossenen Prozess), könnte ein tty / pty-Gerät direkt vom Prozess verwendet werden. Ein Beispiel dafür kann die interaktive Abfrage eines Passworts oder ähnliches sein. )
Janis
2
Obwohl es wahrscheinlich vom Befehl abhängt, -qwürde auch die Ausgabe auf deaktiviert stderr. Dies ermöglicht Muscheln, die es nicht einfach machen, stderr auf stdout zu bringen (ich sehe dich an, csh& tcsh), um das Rauschen zu vermeiden.
Einige Programme bieten eine "leise" Option für Situationen, in denen es andere sinnvolle Ausgaben gibt, die nicht mit Statusmeldungen überfrachtet werden sollen. Das -qoder ein Äquivalent würde die gesamte Programmstatusausgabe zum Schweigen bringen, was beispielsweise einen reinen Datenstrom von taroder ermöglicht gzip.
Neben all den guten Antworten und Punkten oben. Es wird empfohlen, für jede Flagge eine umgekehrte Option bereitzustellen. Also, wenn es ein -v für Ausführlichkeit gibt, sollte es -q für Nicht-Ausführlichkeit geben, ganz oder still. (Dies ist nicht der Diskussionspunkt, aber ...) Das Gleiche wie sollte eine lange Option für jede kurze sein, -q und --quite.
Wie in fast allen Geschäftsbereichen gibt es viele Möglichkeiten, eine Lösung zu finden oder dieselben Ergebnisse zu erzielen. -Q ist einer von ihnen.
-q
unterdrücken alle Ausgaben. Docker verfügt beispielsweise über einen Befehl zum Auflisten von Bildern.docker images
Zeigt eine formatierte Tabelle mit einer Reihe von Informationen an, währenddocker images -q
eine einfache Liste von Bild-IDs ausgegeben wird (nützlich zum Weiterleiten an andere Befehle).Antworten:
Während Sie in einer Shell leicht umleiten können, gibt es andere Kontexte, in denen es nicht so einfach ist, wie wenn Sie den Befehl in einer anderen Sprache ausführen, ohne eine Shell-Befehlszeile zu verwenden. Auch in einer Schale:
um die Größe aller enthaltenen Dateien zu drucken
foo
. Wenn Sie zu umleiten/dev/null
, verlieren Sie beidefind
und diegrep
Ausgabe. Sie müssten darauf zurückgreifen-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(das heißt, eine zusätzliche Shell erzeugen).grep -q foo
ist kürzer alsgrep foo > /dev/null
/dev/null
bedeutet, dass die Ausgabe noch geschrieben und dann verworfen wird. Dies ist weniger effizient, als sie nicht zu schreiben.grep
zum Beispiel mit, bekannt ist-q
,grep
dass die Ausgabe nicht erforderlich ist, wird sie beendet, sobald die erste Übereinstimmung gefunden wird. Mitgrep > /dev/null
würde es immer noch versuchen, alle Übereinstimmungen zu finden.-v|--verbose
). Zum Beispielmplayer
hat a--quiet
und a--really-quiet
. Mit einigen Befehlen können Sie die-qqq
Ausführlichkeit dreimal verringern.quelle
grep
Manpage vorgeschlagen wird, beide Optionen,-q
und-s
, zu vermeiden, wenn Portabilität ein Problem darstellt.grep
Das vorzeitige Beenden ist eine wichtige Optimierung, aber nicht alle Programme mit solchen Optionen können dies.curl -s
verarbeitet weiterhin die gesamten Daten (der dritte Punkt gilt jedoch weiterhin, wodurch Verarbeitungszeit gespart wird).-q
und-s
werden von POSIX angegeben. Wenn wir Systeme in Betracht ziehen, die so alt sind,sh -c '...' sh {} \;
funktionieren meine auch nicht (mit früherenksh
basiertensh
s).Der Befehl kann immer noch ausgegeben werden, wenn er das Gefühl hat, eine Notiz auf dem Bildschirm zu benötigen, aber normalerweise wird nichts ausgegeben. Wenn Sie all auf null umleiten, ist die Ausgabe nicht sichtbar.
quelle
Obwohl es wahrscheinlich vom Befehl abhängt,
-q
würde auch die Ausgabe auf deaktiviertstderr
. Dies ermöglicht Muscheln, die es nicht einfach machen, stderr auf stdout zu bringen (ich sehe dich an,csh
&tcsh
), um das Rauschen zu vermeiden.Einige Programme bieten eine "leise" Option für Situationen, in denen es andere sinnvolle Ausgaben gibt, die nicht mit Statusmeldungen überfrachtet werden sollen. Das
-q
oder ein Äquivalent würde die gesamte Programmstatusausgabe zum Schweigen bringen, was beispielsweise einen reinen Datenstrom vontar
oder ermöglichtgzip
.quelle
Neben all den guten Antworten und Punkten oben. Es wird empfohlen, für jede Flagge eine umgekehrte Option bereitzustellen. Also, wenn es ein -v für Ausführlichkeit gibt, sollte es -q für Nicht-Ausführlichkeit geben, ganz oder still. (Dies ist nicht der Diskussionspunkt, aber ...) Das Gleiche wie sollte eine lange Option für jede kurze sein, -q und --quite.
Wie in fast allen Geschäftsbereichen gibt es viele Möglichkeiten, eine Lösung zu finden oder dieselben Ergebnisse zu erzielen. -Q ist einer von ihnen.
quelle