19Aug

¿Cómo se ejecuta un comando en segundo plano sin salida a menos que haya un error?

Si eres una persona ocupada, entonces lo último que necesitas es que te molesten con una gran cantidad de notificaciones "inútiles", así que, ¿cómo puedes calmar las cosas? La publicación SuperUser Q & A de hoy tiene excelentes respuestas para ayudar al lector a reducir la cantidad de impresiones.

Pregunta de hoy &La sesión de respuesta nos llega por cortesía de SuperUser, una subdivisión de Stack Exchange, una agrupación de sitios web Q & A dirigida por la comunidad.

La pregunta

SuperUser reader 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 la salida del comando codifica un error?

¿Cómo se obtiene un comando para ejecutar en segundo plano sin salida a menos que haya un error?

La respuesta

SuperUser colaboradores Bob y Maximillian Laumeister tienen la respuesta para nosotros. Primero, Bob:

Desafortunadamente, la suposición de que stderr solo se usa para la salida de error no siempre es correcta. Por el contrario,

stderr se usa a menudo para todos y cada uno de los resultados y diagnósticos interactivos( es decir, salida prevista para que el usuario lea en un mensaje interactivo).( 1) wget y dd son ejemplos bien conocidos.

Algunos comandos proporcionarán un indicador( es decir, -quiet o -silent ) para suprimir la salida sin errores. Lee sus páginas man para ver si existe alguna.

Otra convención que se cumple con más frecuencia es el código de salida , un programa devuelve un código de salida cuando se cierra. Normalmente ( 2) , un código de salida de 0 indica éxito y cualquier otro código de salida indica un error.

Con bash , puede obtener el código de salida del último comando del $?Variable En fish , use la variable $ status .Puede conectar stderr a un archivo temporal y solo imprimirlo si se produce un error. Por ejemplo( fish ):

También puede usar algunos accesos directos si no está encadenando comandos:

O:

También puede pasar stdout al mismo buffer utilizando 2 & gt; & 1 & gt;/tmp/ outputbuffer .

( ) Nota: En realidad, no conozco fish , por lo que estoy adaptando el concepto a lo que puedo encontrar en su documentación. La sintaxis podría ser un poco incorrecta. Además, puede usar mktemp para generar unarchivo. Ejecutar y registrar el nombre del archivo en una variable.)

Si necesita ejecutar todo en el fondo de un shell que también está utilizando interactivamente al mismo tiempo, entonces es mejor escribir un script para manejarla salida oculta y ejecuta esa secuencia de comandos en segundo plano con las técnicas estándar( fish ).Diablos, puede poner algo así como la siguiente función en ~ /.config/fish/ config.fish :

Llamar con run-silent somecommand &( donde el y el final hacen que se ejecute en segundo plano)

Tenga en cuenta que esto tragará el código de salida original, y eliminará stdout y stderr en caso de falla. Puede personalizarlo según sea necesario.

( 1) No hay garantía de que la salida de error no aparezca en stdout , ¡algunos programas descargarán todos los resultados allí!

( 2) Lamentablemente, 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 distintas de cero. Nuevamente, revise el manual.

Seguido por la respuesta de Maximillian Laumeister: las utilidades

Unix envían mensajes generales a stdout , y mensajes de error a stderr , por lo que si solo queremos ver mensajes de error, entonces será suficiente suprimir stdout para quesolo stderr obtiene salida a la consola.

La forma de hacerlo( en bash y fish ) es agregar & gt;/dev/ null al comando. Esto canaliza stdout a la nada, pero stderr ( con sus mensajes de error) sigue llegando a la consola.

Por ejemplo:

El comando echo 1 & gt;/dev/ nulo no imprime nada, porque la salida stdout normal está suprimida y no se ha escrito nada en stderr .

El comando man doesnotexist & gt;/dev/ nulo imprime un mensaje de error, porque man escribe su mensaje de error en stderr .

¿Tiene algo que agregar a la explicación? Suena apagado en los comentarios.¿Desea leer más respuestas de otros usuarios de Stack Exchange expertos en tecnología? Mira el hilo de discusión completo aquí.