¿Cómo se ejecuta un comando en segundo plano sin salida a menos que exista un error?
Si eres una persona ocupada, lo último que necesitas es que te molesten con una gran cantidad de notificaciones "inútiles", así que, ¿cómo callas las cosas? La publicación de preguntas y respuestas de SuperUser de hoy tiene algunas respuestas excelentes para ayudar a un lector a reducir la cantidad de salida.
La sesión de Preguntas y Respuestas de hoy nos llega por cortesía de SuperUser, una subdivisión de Stack Exchange, un grupo de sitios web de preguntas y respuestas impulsado por la comunidad..
La pregunta
El superusuario lector Xster quiere saber cómo ejecutar un comando en segundo plano sin salida, a menos que haya un error:
¿Cómo se suprime la salida de un comando, pero se muestra si el código de salida del comando es un error??
¿Cómo se ejecuta un comando en segundo plano sin salida a menos que exista un error??
La respuesta
Los colaboradores de Superusuario Bob y Maximillian Laumeister tienen la respuesta para nosotros. En primer lugar, Bob:
Desafortunadamente, el supuesto de que Stderr Sólo se utiliza para la salida de error no siempre es correcta. Más bien, Stderr a menudo se usa para todos y cada uno de los resultados y diagnósticos interactivos (es decir, los resultados destinados al usuario a leer en un mensaje interactivo).(1) wget y dd son ejemplos conocidos.
Algunos comandos proporcionarán una bandera (es decir,. -tranquilo o -silencio) para suprimir la salida sin error. Lee sus páginas de manual para ver si existe.
Otra convención que se celebra con mayor frecuencia es la código de salida, un programa devuelve un código de salida cuando sale. Típicamente(2), un código de salida de 0 indica éxito, y cualquier otro código de salida indica un error.
Con golpetazo, Puede obtener el código de salida del último comando del PS? variable. En pez, utilizar el $ estado variable. Puedes canalizar Stderr a un archivo temporal y solo imprímalo si ocurre un error. Por ejemplo (pez):
También puede usar algunos accesos directos si no está encadenando comandos:
O:
También puedes canalizar stdout al mismo búfer usando 2> & 1> / tmp / outputbuffer.
(Nota: En realidad no se pez, Así que estoy adaptando el concepto a lo que puedo encontrar en su documentación. La sintaxis puede ser ligeramente incorrecta. Además, puedes usar mktemp para generar un archivo temporal único. Ejecutarlo y registrar el nombre del archivo en una variable.)
Si necesita ejecutar todo el proceso en el fondo de un shell que también está utilizando de forma interactiva al mismo tiempo, es mejor que escriba un script para manejar la ocultación de resultados y ejecutar ese script en segundo plano con las técnicas estándar. (pez). Heck, puedes poner algo como la siguiente función en ~ / .config / fish / config.fish:
Llamar con Comandos silenciosos y (donde el final Y hace que se ejecute en segundo plano)
Tenga en cuenta que esto tragará el código de salida original y volcará ambos stdout y Stderr en caso de fallo. Se puede personalizar según sea necesario..
(1) No hay garantía de que la salida de error no aparezca en stdout, algunos programas volcarán toda la salida allí!
(2) Desafortunadamente, este no es siempre el caso. El código de salida está completamente controlado por el programa y algunos indicarán algunas condiciones de éxito con salidas que no sean cero. De nuevo, revisa el manual.
Seguido por la respuesta de Maximillian Laumeister:
Las utilidades de Unix envían mensajes generales a stdout, y mensajes de error a Stderr, así que si solo queremos ver los mensajes de error, entonces será suficiente para suprimir stdout de modo que solo Stderr obtiene salida a la consola.
La forma de hacer esto (en ambos golpetazo y pez) es añadir > / dev / null a la orden. Esta tuberia stdout en la nada, pero Stderr (con tus mensajes de error) todavía llega a la consola.
Así, por ejemplo:
El comando echo 1> / dev / null No imprime nada, porque lo normal. stdout Se suprime la salida y no se ha escrito nada. Stderr.
El comando el hombre no existe> / dev / null imprime un mensaje de error, porque hombre escribe su mensaje de error a Stderr.
¿Tienes algo que agregar a la explicación? Apaga el sonido en los comentarios. ¿Quieres leer más respuestas de otros usuarios de Stack Exchange con experiencia en tecnología? Echa un vistazo a la discusión completa aquí.