Considere el siguiente nombre de script (ligeramente tonto) 'test1.sh':
#/bin/bash
#
sleep 10 &
echo sleep pid = $!
pkill sleep
Cuando lo ejecuto, obtengo no solo la salida del eco, sino el informe de bash de la muerte del sueño en stderr:
$ ./test1.sh
sleep pid = 3551
./test1.sh: line 5: 3551 Terminated sleep 10
En este caso, me gustaría suprimir la impresión a stderr. Sé que puedo hacerlo en la línea de comando, como en:
$ ./test1.sh 2> /dev/null
... pero ¿hay una manera de suprimir desde dentro de la secuencia de comandos? (Sé que podría envolverlo en un segundo script y hacer que el contenedor lo redirija, pero debe haber algo más fácil ...)
bash
shell-script
stderr
temerario
fuente
fuente
Respuestas:
Tienes razón; pkill no genera el mensaje, bash sí. Sugieres que
Es una posible solución. Como señala UVV, la acción equivalente dentro del script es
Esto redirige el stderr para el script
/dev/null
desde esta declaración hasta que se vuelva a cambiar. Las formas torpes de cambiarlo de nuevo incluyenque redirige stderr a la terminal. Esto es probablemente (pero no necesariamente) donde estaba originalmente.
O
lo que establece que stderr sea lo mismo que stdout, y es probable que esté equivocado.
Una forma más confiable es
que guarda el stderr original en el descriptor de archivo 3 y luego lo restaura.
Otras formas de suprimir solo el anuncio del proceso de muerte incluyen
y
que cambian el stderr solo para los comandos agrupados.
fuente
stdin
ystderr
con nuevos descriptores de archivos, enviar los descriptores originales/dev/null
y luego restaurarlos?{ sleep 10 & pkill sleep;} 2> /dev/null
De acuerdo con esto , podría hacer algo como lo siguiente:
fuente