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.