Me gustaría simplificar la salida de un script suprimiendo la salida de comandos secundarios que generalmente son exitosos.
Sin embargo, -qusarlos 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, fingerscrossedcaptura 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
commanden un archivo temporal eliminado, y luego desviará su salida en cualquiera/dev/nullo 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/fdsnoops 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,yashu 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
stderrlo que para su tarea puede simplemente suprimirstdoutfuente
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) &>xes significativo con la redirección si el comando usa, por ejemplo,timeo daría un error de shell.{ ; }los curlies ... aunqueexites un poco complicado allí, lo admito.$?, puede usarlo,exit $cpero 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