Estoy tratando de ejecutar lo siguiente:
exec &>filename
Después de esto, no puedo ver nada, incluido lo que escribí, está bien.
Lo intento frenéticamente, exec 1>&1
y exec 2>&2
, pero no pasa nada.
Ahora, sin matar el shell, ¿cómo recupero la salida redirigida a stdout y el error redirigido a stderr respectivamente? ¿Son los descriptores de archivo la única forma de referir estándar [in | out] put y stderr?
io-redirection
usuario917279
fuente
fuente
exec
construcción se usa generalmente en scripts que se ejecutan en una subshell, para redirigir su salida, por ejemplo, a un archivo. No veo su uso en una sesión interactiva.Respuestas:
Después de ejecutar
exec &>filename
, la salida estándar y el error estándar del shell van afilename
. La entrada estándar es el descriptor de archivo 0 por definición, y la salida estándar es fd 1 y el error estándar es fd 2.Un descriptor de archivo no se redirige o no se redirige: siempre va a alguna parte (suponiendo que el proceso tenga este descriptor abierto). Redirigir un descriptor de archivo significa cambiar a dónde va. Cuando
exec &>filename
corriste, stdout y stderr se conectaban anteriormente a la terminal y se conectaban afilename
.Siempre hay una manera de referirse a la terminal actual:
/dev/tty
. Cuando un proceso abre este archivo, siempre significa el terminal de control del proceso , cualquiera que sea. Entonces, si desea recuperar el stdout y stderr original de ese shell, puede hacerlo porque el archivo al que estaban conectados todavía está presente.fuente
/dev/tty
funciona en casos donde$(tty)
no/dev/tty
funciona : funciona siempre que el proceso tenga un terminal de control (que es lo mejor que puede esperar, ya que debe haber algo que todavía conecte el proceso con el terminal), mientras$(tty)
que requiere que el terminal todavía esté abierto en entrada estándar.Usted quiere
Lo que está haciendo en su pregunta es replicar en stdout y stderr el stdout y stderr original que ya se han redirigido al archivo.
Como explica la respuesta de Gilles,
tty
devolverá el dispositivo terminal del terminal actual. Aquí es donde los tres descriptores de archivo estándar provienen / van por defecto en un shell de inicio de sesión. Por lo tanto, la declaración anterior se utilizatty
para redirigir stdout y stderr nuevamente al dispositivo terminal como lo eran antes.Si le preocupa la portabilidad (según su comentario sobre la respuesta de Gilles), ambos métodos (la utilidad tty y el
/dev/tty
archivo ) están en el estándar POSIX.Copiado literalmente del comentario de Gilles:
fuente
/dev/tty
: funciona incluso despuésexec <somefile
, mientras que$(tty)
se quejaría "no es un tty".