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?

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"

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"

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

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.
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.