Cómo detener la redirección en bash

8

Yo suelo :

exec >script.log 2>&1

en mi script para redirigir toda la salida a un archivo. Al final del guión, me gustaría imprimir un mensaje en la pantalla. ¿Cómo detengo la redirección?

Willem
fuente

Respuestas:

12

Puede execvolver a llamar para restaurar los descriptores originales. Tendrás que haberlos guardado en alguna parte.

exec 3>&1 4>&2 1>script.log 2>&1
 logged portion 
exec 1>&3 2>&4
echo >&2 "Done"

Dentro de la parte registrada, puede usar los descriptores originales para un comando redirigiendo a los descriptores adicionales.

echo "30 seconds remaining" >&3

Alternativamente, puede colocar la parte registrada de su script dentro de un comando compuesto y redirigir ese comando compuesto. Esto no funciona si desea utilizar los descriptores originales en una trampa en algún lugar dentro de esa parte redirigida.

{
 logged portion 
} >script.log 2>&1
echo >&2 "Done"
Gilles 'SO- deja de ser malvado'
fuente
El comentario sobre hacer eco >&3hace de esta mi solución preferida. Gracias de nuevo)!
Willem
6

Use additinal fd 3 y 4 para stdout y stderr y simplemente redirija 1 y 2 a ellos al final de su script:

exec 3>&1 4>&2
exec >script.log 2>&1

echo "Some code"

exec >&3 2>&4
echo "Done"
prisa
fuente
Esto devuelve un error:exec 3>/dev/stdout 4>/dev/stderr -bash: /dev/stdout: Permission denied
Willem
Este error puede ocurrir cuando intentas iniciar tu script dentro de otro usuario. ¿Utiliza su script a través de sudo?
precipitarse
Sí, eso es todo: hice un su a otra cuenta y ejecuté el código. El script que estoy escribiendo se ejecutará a través de sudo, así que me encontraré con el mismo problema allí. ¿Hay una alternativa?
Willem
Creo que hay una solución elegante, desafortunadamente conozco la única opción, que puede ser absolutamente inaceptable desde el punto de vista de la seguridad: agregue su usuario objetivo a su grupo primario de usuario inicial y agregue permisos de escritura grupal para / proc / self / fd / 1 antes del lanzamiento del script. (o incluso más vulnerable: solo haga un permiso de escritura temporal para todos y elimínelo inmediatamente después de que el script haya terminado sin cambios de grupo).
precipitarse
1
@Willem Esto se soluciona fácilmente mediante el uso de descriptores de archivo en lugar de volver a abrir los archivos, vea mi edición.
Gilles 'SO- deja de ser malvado'
1

Primero debe verificar si tiene o no un tty en absoluto.

if tty -s; then
    echo "Hello, World" > $(tty)
fi
David Baggerman
fuente
1
Tenga en cuenta que de esta manera no se puede alimentar la salida al programa externo.
precipitarse
No es necesario usar la ttyutilidad externa . Puede redirigir al dispositivo especial /dev/tty.
Pausado hasta nuevo aviso.