¿Por qué muchos comandos proporcionan una opción "silenciosa"?

37

¿Por qué muchos comandos ofrecen la opción -qo --quietsuprimir la salida cuando puede lograr fácilmente lo mismo al redirigir la salida estándar al archivo nulo?

August Karlstrom
fuente
3
Considero que principalmente como una bandera de conveniencia.
Janis
77
No todos los comandos se utilizan -qpara suprimir todas las salidas. Por ejemplo, Docker tiene un comando para enumerar imágenes; docker imagesmuestra una tabla formateada con un montón de información, mientras docker images -qgenera una lista simple de ID de imágenes (útil para canalizar a otros comandos).
nuevo123456

Respuestas:

71
  • Si bien puede redirigir fácilmente en un shell, hay otros contextos en los que no es tan fácil, como cuando se ejecuta el comando en otro idioma sin usar una línea de comandos de shell. Incluso en una concha:

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

    para imprimir el tamaño de todos los archivos que contienen foo. Si redirige a /dev/null, pierde ambos findy la grepsalida. Tendría que recurrir a -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(es decir, generar un caparazón adicional).

  • grep -q foo es más corto de escribir que grep foo > /dev/null
  • Redirigir a /dev/nullsignifica que la salida aún se escribe y luego se descarta, eso es menos eficiente que no escribirla (y no asignar, preparar esa salida para que se escriba)
  • eso permite más optimizaciones. En el caso de, greppor ejemplo, dado que with -q, grepsabe que la salida no es necesaria, sale tan pronto como encuentra la primera coincidencia. Con grep > /dev/null, aún trataría de encontrar todas las coincidencias.
  • silencio no necesariamente significa silencio . Para algunos comandos, significa reducir la verbosidad (lo contrario de -v|--verbose). Por ejemplo, mplayertiene a --quiety a --really-quiet. Con algunos comandos, puede usar -qqqpara disminuir la verbosidad 3 veces.
Stéphane Chazelas
fuente
Es de destacar que en la greppágina de manual se sugiere evitar ambas opciones -q, y -s, si la portabilidad es una preocupación. grepLa salida anticipada es una optimización importante, pero no todos los programas con tales opciones pueden hacer eso; curl -saún procesará todos los datos (pero el tercer punto aún se aplica, lo que ahorra tiempo de procesamiento).
Janis
66
@ Janis, eso sería portabilidad a sistemas muy antiguos. Ambos -qy -sestán especificados por POSIX. Si consideramos sistemas tan antiguos, entonces mi sh -c '...' sh {} \;tampoco funcionará (con s kshbasados ​​en versiones anteriores sh).
Stéphane Chazelas
La página de manual menciona: grep de estilo USG también carecía de -q pero su opción -s se comportaba como grep de GNU. - Pensé que la diferencia de comportamiento podría ser un problema. No puedo juzgar sobre su relevancia.
Janis
Frecuentemente uso las opciones -q y --quiet cuando solo me importa el código de retorno de un comando en un script. Las razones señaladas anteriormente son ejemplos aún mejores de por qué.
Mark Stewart
@ StéphaneChazelas: se sorprendería de cómo (partes de) muchos sistemas todavía son tan viejos ... (bueno, en realidad, no tantos ^^ pero todavía hay algunos)
Olivier Dulac
3

Todavía permite que el comando se apague cuando sienta que necesita una nota en la pantalla, pero normalmente no saca nada. con la redirección de todo a nulo no hay posibilidad de que se vea la salida.

LhasaDad
fuente
Bueno, tranquilo significa que no se espera respuesta; Sería inesperado si viéramos la salida de todos modos. (En caso de que de todos modos haya algo "realmente, realmente" importante para imprimir (en un proceso conectado a un terminal), el dispositivo podría utilizar directamente un dispositivo tty / pty. Un ejemplo de esto puede ser la consulta interactiva de una contraseña, o algo así. )
Janis
2

Aunque probablemente depende del comando, -qtambién deshabilitaría la salida a stderr. Esto permite que los proyectiles que no permiten fácilmente duplicar stderr stdr (te estoy mirando, csh& tcsh) eviten el ruido.

Algunos programas ofrecen una opción "silenciosa" para situaciones en las que puede tener otro resultado significativo que no desea que esté lleno de mensajes de estado. El -qo equivalente silenciaría toda la salida del estado del programa, permitiendo un flujo de datos puro desde, digamos, taro gzip.

Joe Sewell
fuente
0

Además de todas las buenas respuestas y puntos anteriores. Es una buena práctica proporcionar una opción opuesta para cada bandera. Entonces, si hay una -v para verbosidad, debería haber -q para no verbosidad, silencio o silencio. (este no es el punto de discusión pero ...) Igual que debería ser una opción larga para cada corta, -q y --quite.

Como en casi todo en nuestro negocio, hay muchas maneras de obtener una solución o los mismos resultados. Tener -q es uno de ellos.

Johandry
fuente