Por que muitos comandos fornecem uma opção "silenciosa"?
37
Por que muitos comandos fornecem a opção -qou --quietsuprimem a saída quando você pode obter facilmente a mesma coisa redirecionando a saída padrão para o arquivo nulo?
Considero isso principalmente como uma bandeira de conveniência.
Janis
7
Nem todos os comandos usam -qpara suprimir toda a saída. Por exemplo, o Docker possui um comando para listar imagens; docker imagesmostra uma tabela formatada com um monte de informações, enquanto docker images -qgera uma lista simples de IDs de imagem (útil para canalizar para outros comandos).
new123456
Respostas:
71
Embora você possa redirecionar facilmente em um shell, há outros contextos em que não é tão fácil, como ao executar o comando em outro idioma sem usar uma linha de comando do shell. Mesmo em uma concha:
para imprimir o tamanho de todos os arquivos que contêm foo. Se você redirecionar para /dev/null, você perde os dois finde a grepsaída. Você precisaria recorrer a -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(isto é, gerar uma concha extra).
grep -q foo é mais curto para digitar do que grep foo > /dev/null
Redirecionar para /dev/nullsignifica que a saída ainda é gravada e descartada, menos eficiente do que não gravá-la (e não alocá-la, prepare essa saída para ser gravada)
isso permite otimizações adicionais. No caso de, greppor exemplo, já que com -q, grepsabe que a saída não é necessária, ela sai assim que encontra a primeira correspondência. Com grep > /dev/null, ainda tentaria encontrar todas as correspondências.
Quieto não significa necessariamente silêncio . Para alguns comandos, significa reduzir a verbosidade (o oposto de -v|--verbose). Por exemplo, mplayertem a --quiete a --really-quiet. Com alguns comandos, você pode usar -qqqpara diminuir a verbosidade 3 vezes.
Digno de nota-se que no grephomem páginas ambas as opções, -qe -s, são sugeridas para ser evitado se a portabilidade é uma preocupação. grepA saída antecipada do é uma otimização importante, mas nem todos os programas com essas opções podem fazer isso; curl -sainda processará todos os dados (mas o terceiro ponto ainda se aplica, economizando tempo de processamento).
Janis
6
@ Janis, isso seria portabilidade para sistemas muito antigos. Ambos -qe -ssão especificados pelo POSIX. Se considerarmos sistemas tão antigos, o meu sh -c '...' sh {} \;também não funcionará (com s kshbaseados anteriormente sh).
Stéphane Chazelas 19/03/2015
A página de manual menciona: grep no estilo USG também não possuía -q, mas sua opção -s se comportava como o GNU grep. - Pensei que a diferença de comportamento pudesse ser um problema. Não posso julgar sobre sua relevância.
Janis
Eu freqüentemente uso as opções -q e --quiet quando me preocupo apenas com o código de retorno de um comando em um script. As razões mencionadas acima são exemplos ainda melhores do porquê.
Mark Stewart
@ StéphaneChazelas: você ficaria espantado como (partes de) muitos sistemas ainda são aquele velho ... (bem, na verdade, não que muitos ^^ mas ainda há alguns)
Olivier Dulac
3
Ele ainda permite que o comando apague quando sente que precisa de uma nota na tela, mas normalmente ele não apaga nada. com o redirecionamento de todos para nulo, não há chance de a saída ser vista.
Bem, silencioso significa que nenhuma resposta é esperada; seria inesperado se veríamos a saída de qualquer maneira. (Caso exista algo realmente realmente muito importante para imprimir (em um processo conectado ao terminal), um dispositivo tty / pty poderia ser usado diretamente pelo processo. Um exemplo disso pode ser a consulta interativa de uma senha ou algo assim. )
Janis
2
Embora provavelmente dependa do comando, -qtambém desabilitaria a saída para stderr. Isso permite que as conchas que não permitem facilmente que o stderr dupe stdout (eu estou olhando para você, csh& tcsh) evite o ruído.
Alguns programas fornecem uma opção "silenciosa" para situações em que pode haver outra saída significativa que você não deseja que esteja cheia de mensagens de status. O -qou equivalente silenciaria toda a saída do status do programa, permitindo um fluxo de dados puro de, digamos, tarou gzip.
Além de todas as boas respostas e pontos acima. É uma prática recomendada fornecer uma opção oposta para cada sinalizador. Portanto, se existe um -v para verbosidade, deve haver -q para não verbosidade, bastante ou silêncio. (este não é o ponto de discussão, mas ...) O mesmo que deve ser uma opção longa para cada uma curta, -q e --quite.
Como em quase tudo em nossos negócios, existem muitas maneiras de obter uma solução ou os mesmos resultados. Ter -q é um deles.
-q
para suprimir toda a saída. Por exemplo, o Docker possui um comando para listar imagens;docker images
mostra uma tabela formatada com um monte de informações, enquantodocker images -q
gera uma lista simples de IDs de imagem (útil para canalizar para outros comandos).Respostas:
Embora você possa redirecionar facilmente em um shell, há outros contextos em que não é tão fácil, como ao executar o comando em outro idioma sem usar uma linha de comando do shell. Mesmo em uma concha:
para imprimir o tamanho de todos os arquivos que contêm
foo
. Se você redirecionar para/dev/null
, você perde os doisfind
e agrep
saída. Você precisaria recorrer a-exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;
(isto é, gerar uma concha extra).grep -q foo
é mais curto para digitar do quegrep foo > /dev/null
/dev/null
significa que a saída ainda é gravada e descartada, menos eficiente do que não gravá-la (e não alocá-la, prepare essa saída para ser gravada)grep
por exemplo, já que com-q
,grep
sabe que a saída não é necessária, ela sai assim que encontra a primeira correspondência. Comgrep > /dev/null
, ainda tentaria encontrar todas as correspondências.-v|--verbose
). Por exemplo,mplayer
tem a--quiet
e a--really-quiet
. Com alguns comandos, você pode usar-qqq
para diminuir a verbosidade 3 vezes.fonte
grep
homem páginas ambas as opções,-q
e-s
, são sugeridas para ser evitado se a portabilidade é uma preocupação.grep
A saída antecipada do é uma otimização importante, mas nem todos os programas com essas opções podem fazer isso;curl -s
ainda processará todos os dados (mas o terceiro ponto ainda se aplica, economizando tempo de processamento).-q
e-s
são especificados pelo POSIX. Se considerarmos sistemas tão antigos, o meush -c '...' sh {} \;
também não funcionará (com sksh
baseados anteriormentesh
).Ele ainda permite que o comando apague quando sente que precisa de uma nota na tela, mas normalmente ele não apaga nada. com o redirecionamento de todos para nulo, não há chance de a saída ser vista.
fonte
Embora provavelmente dependa do comando,
-q
também desabilitaria a saída parastderr
. Isso permite que as conchas que não permitem facilmente que o stderr dupe stdout (eu estou olhando para você,csh
&tcsh
) evite o ruído.Alguns programas fornecem uma opção "silenciosa" para situações em que pode haver outra saída significativa que você não deseja que esteja cheia de mensagens de status. O
-q
ou equivalente silenciaria toda a saída do status do programa, permitindo um fluxo de dados puro de, digamos,tar
ougzip
.fonte
Além de todas as boas respostas e pontos acima. É uma prática recomendada fornecer uma opção oposta para cada sinalizador. Portanto, se existe um -v para verbosidade, deve haver -q para não verbosidade, bastante ou silêncio. (este não é o ponto de discussão, mas ...) O mesmo que deve ser uma opção longa para cada uma curta, -q e --quite.
Como em quase tudo em nossos negócios, existem muitas maneiras de obter uma solução ou os mesmos resultados. Ter -q é um deles.
fonte