¿Cómo suprimir la salida de un comando pero mostrarlo si la salida del comando codifica un error?
Desafortunadamente, la suposición que stderr
solo se usa para la salida de error no siempre es correcta. Por el contrario, a stderr
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 bien conocidos.
Algunos comandos proporcionarán un indicador (por ejemplo, -quiet
or -silent
) para suprimir la salida sin error; lea sus páginas de manual para ver si existe.
Otra convención que es más frecuente es el 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 bash
, puede obtener el código de salida del último comando de la $?
variable. En fish
, use la $status
variable. Puede canalizar stderr
a un archivo temporal y solo imprimirlo si se produce un error. Por ejemplo ( fish
):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
También puede usar algunos atajos, si no está encadenando comandos:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
O:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
También puede canalizar stdout
al mismo búfer utilizando 2>&1 >/tmp/outputbuffer
.
(Nota: en realidad no lo sé fish
, así que estoy adaptando el concepto a lo que puedo encontrar en su documentación. La sintaxis puede ser ligeramente incorrecta. Además, puede usarla mktemp
para generar un archivo temporal único: ejecútelo y grabe el nombre de archivo en una variable.)
Si necesita ejecutar todo en el fondo de un shell que también está utilizando de forma interactiva al mismo tiempo, entonces es mejor escribir un script para manejar la salida oculta y ejecutar ese script en segundo plano con las técnicas estándar ( fish
) Heck, puedes poner algo como la siguiente función en ~/.config/fish/config.fish
:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
Llamar con run-silent somecommand &
(donde el seguimiento &
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 falla. Puede personalizarlo según sea necesario.
1 Ni siquiera hay una garantía de que la salida de error no aparezca 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 distintas de cero. Nuevamente, consulte el manual.
Las utilidades de Unix envían mensajes generales
stdout
y mensajes de error astderr
, por lo que si solo queremos ver mensajes de error, será suficiente suprimirlosstdout
para que solostderr
salga a la consola.La forma de hacer esto (en ambos
bash
yfish
) es agregar>/dev/null
al comando. Esto canaliza stdout hacia la nada, pero stderr (con sus mensajes de error) todavía llega a la consola.Entonces, por ejemplo:
El comando
echo 1 >/dev/null
no imprime nada porquestdout
se suprime la salida normal y no se escribió nada en stderr.El comando
man doesnotexist >/dev/null
imprime un mensaje de error, porqueman
escribe su mensaje de error enstderr
.fuente
Esto ejecutará el comando en segundo plano y escribirá errores en un archivo de registro mientras ignora la salida normal
fuente