Warum bieten viele Befehle eine "leise" Option?

37

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?

August Karlstrom
quelle
3
Ich betrachte das meist als Convenience-Flag.
Janis
7
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:

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

    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.
Stéphane Chazelas
quelle
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.

LhasaDad
quelle
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.

Joe Sewell
quelle
0

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.

Johandry
quelle