Me gustaría simplificar la salida de un script suprimiendo la salida de comandos secundarios que generalmente son exitosos.
Sin embargo, -q
usarlos oculta la salida cuando ocasionalmente fallan, por lo que no tengo forma de entender el error. Además, estos comandos registran su salida stderr
.
¿Hay alguna forma de suprimir la salida de un comando solo si tiene éxito ?
Por ejemplo (pero no limitado a) algo como esto:
mycommand | fingerscrossed
Si todo va bien, fingerscrossed
captura la salida y la descarta. De lo contrario, se hace eco a la salida estándar o de error (lo que sea).
scripting
error-handling
Matthieu Napoli
fuente
fuente
moreutils
. Agradable para mí, de todos modos :)Eso probablemente debería hacer el truco. Almacenará en búfer la salida de cada uno
command
en un archivo temporal eliminado, y luego desviará su salida en cualquiera/dev/null
o stderr dependiendo de si su estado de retorno no fue cero. Debido a que el archivo temporal se elimina con anticipación, no puede ser leído por ningún proceso que no sea el shell actual y sus elementos secundarios en su descriptor de archivo (salvo los/proc/$pid/fd
snoops furtivos con los permisos apropiados) , y no requiere limpieza cuando finalice.Quizás una solución más conveniente en sistemas Linux:
... que, en la mayoría de conchas, funciona de manera similar al otro, a que se le puede llamar como:
divert some simple-command with args
. Tenga cuidado con los comandos de alto rendimiento en"$@"
, sin embargo, paradash
,yash
u otros shells que hacen documentos aquí con tuberías: creo que es posible que esos shells llenen el búfer de tuberías (por defecto, alrededor de 128 kb en linuxes) y por lo tanto un punto muerto . Eso no debería ser una preocupación paraksh
,mksh
,bash
,zsh
, o el shell Bourne, aunque - todos los hacen básicamente lo mismo que hice explícitamente más arriba conexec
.fuente
Por lo general, en caso de error, el comando emite mensajes, por
stderr
lo que para su tarea puede simplemente suprimirstdout
fuente
stderr
(por lo que no tiene ningún efecto).Para hacer tu propia crónica
fuente
Hago algo como esto en mis makefiles:
Adaptando eso a su situación, podría hacer algo como esto:
Entonces, "if" ejecuta el comando y canaliza la salida a mycommand.log. Si necesita atrapar stdout vs stdout vs lo que sea, es posible que deba cambiar el comando de tubería '&>' a '>'. Si el comando falla, capture el código de error, imprima el contenido de mycommand.log, elimine mycommand.log y finalmente regrese con el código de error original.
Sin la (salida $ c), regresaría con el código de salida que coincide con lo que devolvió el comando 'rm'.
Finalmente, si quieres un trazador de líneas, algo como esto funcionaría.
fuente
(...)
asi? Porque no hace nada útil para ti, sino que genera subcapas adicionales.(exit $c)
está configurando$?
, que es algo que no puede hacer de otra manera.if ! (mycommand) &>x
es significativo con la redirección si el comando usa, por ejemplo,time
o daría un error de shell.{ ; }
los curlies ... aunqueexit
es un poco complicado allí, lo admito.$?
, puede usarlo,exit $c
pero sí, en otros casos(exit $?)
tiene valor (aunque una función de shellrret() { return $1; }
sería mejor en general, diría). La subshell para comandos todavía no funciona realmente como lo indicó mikeserv.Acabo de encontrar esta respuesta mucho más simple en esta otra pregunta :
¡Funciona de maravilla!
fuente