significa - redirigir salidas linux
Después de usar `exec 1> file`, ¿cómo puedo detener esta redirección de STDOUT al archivo y restablecer el funcionamiento normal de STDOUT? (4)
Q1
Debe prepararse para la recuperación antes de realizar el primer exec
:
exec 3>&1 1>file
Para recuperar el resultado estándar original más tarde:
exec 1>&3 3>&-
El primer exec
copia el descriptor de archivo original 1 (salida estándar) al descriptor de archivo 3, luego redirige la salida estándar al archivo nombrado. El segundo exec
copia el descriptor de archivo 3 a la salida estándar nuevamente y luego cierra el descriptor de archivo 3.
Q2
Esto es un poco abierto. Puede describirse en un nivel de código C o en el nivel de línea de comandos del shell.
exec 1>file
simplemente redirige la salida estándar (1) del shell al archivo nombrado. El descriptor de archivo uno ahora hace referencia al archivo nombrado; cualquier salida escrita en salida estándar irá al archivo. (Tenga en cuenta que las solicitudes en un shell interactivo se escriben en un error estándar, no en un resultado estándar).
exec 1>&-
simplemente cierra la salida estándar del shell. Ahora no hay un archivo abierto para salida estándar. Los programas pueden alterarse si se ejecutan sin salida estándar.
Q3
Si cierra los tres de entrada estándar, salida estándar y error estándar, un shell interactivo saldrá cuando cierre la entrada estándar (porque obtendrá EOF cuando lea el próximo comando). Se continuará ejecutando un script de shell, pero los programas que ejecuta pueden alterarse porque están garantizados 3 canales de archivos abiertos - entrada estándar, salida estándar, error estándar - y cuando su shell los ejecuta, si no hay otra redirección de E / S , entonces no obtienen los canales de archivos que les fueron prometidos y todo el infierno se puede desatar (y la única forma en que sabrá es que el estado de salida del comando probablemente no sea cero - éxito).
Soy un novato en scripting shell y estoy usando Ubuntu-11.10. En la terminal después de usar exec 1>file
comando exec 1>file
, cualquier comando que dé al terminal, su salida no se muestra en la terminal. Sé que STDOUT se redirecciona al archivo, la salida de esos comandos se redirige al archivo.
Mis preguntas estan aqui
Una vez que utilizo el
exec 1>file
, ¿cómo puedo deshacerme de esto? es decir, ¿cómo puedo detener la redirección de STDOUT al archivo y restablecer el funcionamiento normal de STDOUT (es decir, redireccionar al terminal en lugar de al archivo)?Intenté usar
exec 1>&-
pero no funcionó ya que esto cierra el descriptor de archivo STDOUT.Por favor, arroje luz sobre toda esta operación de
exec 1>file
yexec 1>&-
¿Qué pasará si cerramos los descriptores de archivos estándar 0, 1, 2 usando
exec 0>&-
exec 1>&-
exec 2>&-
?
Aunque estoy totalmente de acuerdo con el Q1 de Jonathan, algunos sistemas tienen /dev/stdout
, por lo que es posible que pueda exec 1>file; ...; exec 1>/dev/stdout
exec 1>file; ...; exec 1>/dev/stdout
Q1 : hay una manera simple de restaurar stdout al terminal después de haber sido redirigido a un archivo:
exec >/dev/tty
Aunque normalmente se requiere guardar el descriptor original del archivo stdout para que se restaure más adelante, en este caso particular, desea que stdout
sea /dev/tty
por lo que no es necesario hacer más.
$ date
Mon Aug 25 10:06:46 CEST 2014
$ exec > /tmp/foo
$ date
$ exec > /dev/tty
$ date
Mon Aug 25 10:07:24 CEST 2014
$ ls -l /tmp/foo
-rw-r--r-- 1 jlliagre jlliagre 30 Aug 25 10:07 /tmp/foo
$ cat /tmp/foo
Mon Aug 25 10:07:05 CEST 2014
Q2 : el exec 1>file
es una forma un poco más prolija de exec >file
que, como ya se mencionó, redirige el stdout al archivo dado, siempre que tenga el derecho de crearlo / escribirlo. El archivo se crea si no existe, se trunca si lo hace.
exec 1>&-
está cerrando la salida estándar, que probablemente sea una mala idea en la mayoría de las situaciones.
Q3 : los comandos deben ser
exec 0<&-
exec 1>&-
exec 2>&-
Tenga en cuenta la redirección inversa para stdin.
Puede ser simplificado de esa manera:
exec <&- >&- 2>&-
Este comando cierra los tres descriptores de archivos estándar. Esta es una muy mala idea. Si desea que un script se desconecte de estos canales, sugeriría este enfoque más sólido:
exec </dev/null >/dev/null 2>&1
En ese caso, todos los resultados se descartarán en lugar de desencadenar un error, y toda la entrada devolverá solo nada en lugar de fallar.
La respuesta aceptada es demasiado detallada para mí. Entonces, decidí resumir una respuesta a tu respuesta original.
Usando Bash versión 4.3.39 (2) -release
En un x86 de 32 bits en Cygwin Machine
DADO:
- Stdin es fd # 0.
- Stdout es fd # 1.
- Stderr es fd # 2.
RESPUESTA (escrita en bash):
exec 1> ./output.test.txt
echo -e "First Line: Hello World!"
printf "%s/n" "2nd Line: Hello Earth!" "3rd Line: Hello Solar System!"
# This is uneccessary, but
# it stops or closes stdout.
# exec 1>&-
# Send stdout back to stdin
exec 1>&0
# Oops... I need to append some more data.
# So, lets append to the file.
exec 1>> ./output.test.txt
echo -e "# Appended this line and the next line is empty./n"
# Send stdout back to stdin
exec 1>&0
# Output the contents to stdout
cat ./output.test.txt
PALABRAS CLAVE ÚTILES:
También hay here-docs, here-strings y process-substitution para redirección de IO en Bourne, Bash, tcsh, zsh para Linux, BSD, AIX, HP, Busybox, Toybox y otros.