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?

August Karlstrom
fonte
3
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:

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

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

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

Joe Sewell
fonte
0

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.

Johandry
fonte