Pourquoi de nombreuses commandes fournissent-elles une option «silencieuse»?
37
Pourquoi de nombreuses commandes offrent-elles l'option -qou --quietde supprimer la sortie alors que vous pouvez facilement obtenir la même chose en redirigeant la sortie standard vers le fichier null?
Je considère cela principalement comme un drapeau de complaisance.
Janis
7
Toutes les commandes n'utilisent pas -qpour supprimer toutes les sorties. Par exemple, Docker a une commande pour lister les images; docker imagesaffiche un tableau formaté avec un tas d’informations, tout en docker images -qgénérant une liste complète d’ID d’image (utile pour la canalisation vers d’autres commandes).
new123456
Réponses:
71
Bien que vous puissiez facilement rediriger dans un shell, il existe d'autres contextes où ce n'est pas aussi facile, comme lorsque vous exécutez la commande dans une autre langue sans utiliser de ligne de commande shell. Même dans une coquille:
pour imprimer la taille de tous les fichiers qui contiennent foo. Si vous redirigez vers /dev/null, vous perdez les deux findet la grepsortie. Vous devez avoir recours à -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(c'est-à-dire créer une coquille supplémentaire).
grep -q foo est plus courte à taper que grep foo > /dev/null
Redirection vers /dev/nullsignifie que la sortie est toujours écrite et ensuite supprimée, ce qui est moins efficace que de ne pas l'écrire (et non d'allouer, préparez cette sortie pour qu'elle soit écrite)
cela permet d'autres optimisations. Dans le cas de, greppar exemple, avec with -q, grepsait que la sortie n'est pas requise, elle se ferme dès qu'elle trouve la première correspondance. Avec grep > /dev/null, il serait toujours essayer de trouver tous les matches.
calme ne signifie pas nécessairement silencieux . Pour certaines commandes, cela signifie réduire la verbosité (l'opposé de -v|--verbose). Par exemple, mplayera --quietet a --really-quiet. Avec certaines commandes, vous pouvez utiliser -qqqpour diminuer la verbosité 3 fois.
Il est à noter que dans la greppage de manuel, les deux options -q, et -s, sont suggérées pour être évitées si la transférabilité est une préoccupation. grepLa sortie anticipée est une optimisation importante, mais tous les programmes dotés de telles options ne peuvent pas le faire. curl -straitera toujours l’ensemble des données (mais le troisième point s’appliquera toujours, permettant ainsi d’économiser du temps de traitement).
Janis
6
@ Janis, ce serait la portabilité vers de très vieux systèmes. Les deux -qet -ssont spécifiés par POSIX. Si nous voulons considérer les systèmes anciens, alors mon sh -c '...' sh {} \;ne fonctionnera pas non plus (avec les versions antérieures à kshbase shs).
Stéphane Chazelas
La page de manuel mentionne: USP-style grep manquait également -q mais son option -s se comportait comme GNU grep. - Je pensais que la différence de comportement pouvait être un problème. Je ne peux pas juger de sa pertinence.
Janis
J'utilise fréquemment les options -q et --quiet lorsque je me soucie uniquement du code de retour d'une commande dans un script. Les raisons notées ci-dessus en sont des exemples encore meilleurs.
Mark Stewart
@ StéphaneChazelas: vous seriez surpris de voir que (certaines parties) de nombreux systèmes sont toujours aussi vieux ... (enfin, pas beaucoup ^^ mais il y en a encore)
Olivier Dulac
3
Cela permet toujours à la commande de sortir quand il sent qu'il faut une note à l'écran mais normalement, rien ne sort. avec tout rediriger vers null, il n’ya aucune chance que la sortie soit vue.
Eh bien, calme signifie qu'aucune réponse n'est attendue. il serait inattendu de voir une sortie de toute façon. (Dans le cas où il y aurait de toute façon quelque chose de "vraiment très" important à imprimer (dans un processus attaché à un terminal), un périphérique tty / pty pourrait être directement utilisé par le processus. Un exemple de cela pourrait être la recherche interactive d'un mot de passe, ou quelque chose de ce genre. )
Janis
2
Bien que cela dépende probablement de la commande, -qcela désactiverait également la sortie stderr. Cela permet aux obus qui ne permettent pas facilement de duper stderr to stdout (je vous regarde, csh& tcsh) pour éviter le bruit.
Certains programmes fournissent une option "silencieuse" dans les situations où il peut avoir une autre sortie significative que vous ne voulez pas encombrer de messages d'état. Le -qou équivalent ferait taire toutes les sorties de l' état du programme, ce qui permet un flux de données pur, disons, tarou gzip.
Outre toutes les bonnes réponses et les points ci-dessus. Il est recommandé d’offrir une option opposée à chaque drapeau. Donc, s'il y a un -v pour la verbosité, il devrait y avoir -q pour la non-verbosité, tout à fait ou le silence. (Ce n'est pas le point de discussion mais ...) Même chose qui devrait être une option longue pour tout court, -q et --quite.
Comme dans presque toutes les activités de notre entreprise, il existe de nombreuses façons d'obtenir une solution ou d'obtenir les mêmes résultats. Avoir -q est l'un d'entre eux.
-q
pour supprimer toutes les sorties. Par exemple, Docker a une commande pour lister les images;docker images
affiche un tableau formaté avec un tas d’informations, tout endocker images -q
générant une liste complète d’ID d’image (utile pour la canalisation vers d’autres commandes).Réponses:
Bien que vous puissiez facilement rediriger dans un shell, il existe d'autres contextes où ce n'est pas aussi facile, comme lorsque vous exécutez la commande dans une autre langue sans utiliser de ligne de commande shell. Même dans une coquille:
pour imprimer la taille de tous les fichiers qui contiennent
foo
. Si vous redirigez vers/dev/null
, vous perdez les deuxfind
et lagrep
sortie. Vous devez avoir recours à-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(c'est-à-dire créer une coquille supplémentaire).grep -q foo
est plus courte à taper quegrep foo > /dev/null
/dev/null
signifie que la sortie est toujours écrite et ensuite supprimée, ce qui est moins efficace que de ne pas l'écrire (et non d'allouer, préparez cette sortie pour qu'elle soit écrite)grep
par exemple, avec with-q
,grep
sait que la sortie n'est pas requise, elle se ferme dès qu'elle trouve la première correspondance. Avecgrep > /dev/null
, il serait toujours essayer de trouver tous les matches.-v|--verbose
). Par exemple,mplayer
a--quiet
et a--really-quiet
. Avec certaines commandes, vous pouvez utiliser-qqq
pour diminuer la verbosité 3 fois.la source
grep
page de manuel, les deux options-q
, et-s
, sont suggérées pour être évitées si la transférabilité est une préoccupation.grep
La sortie anticipée est une optimisation importante, mais tous les programmes dotés de telles options ne peuvent pas le faire.curl -s
traitera toujours l’ensemble des données (mais le troisième point s’appliquera toujours, permettant ainsi d’économiser du temps de traitement).-q
et-s
sont spécifiés par POSIX. Si nous voulons considérer les systèmes anciens, alors monsh -c '...' sh {} \;
ne fonctionnera pas non plus (avec les versions antérieures àksh
basesh
s).Cela permet toujours à la commande de sortir quand il sent qu'il faut une note à l'écran mais normalement, rien ne sort. avec tout rediriger vers null, il n’ya aucune chance que la sortie soit vue.
la source
Bien que cela dépende probablement de la commande,
-q
cela désactiverait également la sortiestderr
. Cela permet aux obus qui ne permettent pas facilement de duper stderr to stdout (je vous regarde,csh
&tcsh
) pour éviter le bruit.Certains programmes fournissent une option "silencieuse" dans les situations où il peut avoir une autre sortie significative que vous ne voulez pas encombrer de messages d'état. Le
-q
ou équivalent ferait taire toutes les sorties de l' état du programme, ce qui permet un flux de données pur, disons,tar
ougzip
.la source
Outre toutes les bonnes réponses et les points ci-dessus. Il est recommandé d’offrir une option opposée à chaque drapeau. Donc, s'il y a un -v pour la verbosité, il devrait y avoir -q pour la non-verbosité, tout à fait ou le silence. (Ce n'est pas le point de discussion mais ...) Même chose qui devrait être une option longue pour tout court, -q et --quite.
Comme dans presque toutes les activités de notre entreprise, il existe de nombreuses façons d'obtenir une solution ou d'obtenir les mêmes résultats. Avoir -q est l'un d'entre eux.
la source