¿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?
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:
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.
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.
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.
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.
-q
para suprimir todas las salidas. Por ejemplo, Docker tiene un comando para enumerar imágenes;docker images
muestra una tabla formateada con un montón de información, mientrasdocker images -q
genera una lista simple de ID de imágenes (útil para canalizar a otros comandos).Respuestas:
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:
para imprimir el tamaño de todos los archivos que contienen
foo
. Si redirige a/dev/null
, pierde ambosfind
y lagrep
salida. 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 quegrep foo > /dev/null
/dev/null
significa 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)grep
por ejemplo, dado que with-q
,grep
sabe que la salida no es necesaria, sale tan pronto como encuentra la primera coincidencia. Congrep > /dev/null
, aún trataría de encontrar todas las coincidencias.-v|--verbose
). Por ejemplo,mplayer
tiene a--quiet
y a--really-quiet
. Con algunos comandos, puede usar-qqq
para disminuir la verbosidad 3 veces.fuente
grep
página de manual se sugiere evitar ambas opciones-q
, y-s
, si la portabilidad es una preocupación.grep
La salida anticipada es una optimización importante, pero no todos los programas con tales opciones pueden hacer eso;curl -s
aún procesará todos los datos (pero el tercer punto aún se aplica, lo que ahorra tiempo de procesamiento).-q
y-s
están especificados por POSIX. Si consideramos sistemas tan antiguos, entonces mish -c '...' sh {} \;
tampoco funcionará (con sksh
basados en versiones anterioressh
).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.
fuente
Aunque probablemente depende del comando,
-q
también deshabilitaría la salida astderr
. 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
-q
o equivalente silenciaría toda la salida del estado del programa, permitiendo un flujo de datos puro desde, digamos,tar
ogzip
.fuente
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.
fuente