Estoy tratando de redirigir todos los resultados de bash (solicitud, entrada del usuario, resultados) a un archivo
Ejemplo:
/bin/bash > file.txt 2>&1
Pensé que funcionaría, pero no recibo el aviso. ¿Alguien puede decirme qué estoy haciendo mal?
Estoy tratando de redirigir todos los resultados de bash (solicitud, entrada del usuario, resultados) a un archivo
Ejemplo:
/bin/bash > file.txt 2>&1
Pensé que funcionaría, pero no recibo el aviso. ¿Alguien puede decirme qué estoy haciendo mal?
Respuestas:
Bash genera la solicitud solo en modo interactivo. Es decir, normalmente se envía al terminal (/ dev / tty en linux). Eso no es / dev / stdout o / dev / stdin :)
Ahora, no estoy seguro, pero puedo imaginar que bash permitirá un modo interactivo limitado cuando no haya un tty completamente funcional. En ese caso, esperaría que el aviso se escriba en stdout. No he probado eso.
Buena prueba de concepto:
(for a in some set of words; do echo $a > /dev/tty; done) 2>&1 > /dev/null
solo generará 1..10 como si no hubiera redirección. Al igual que la solicitud, la salida se envía directamente a la terminal (que fallará si no hay una)
SUGERENCIA: si desea que se recopile todo
set -o xtrace
(aka set -x
, bash -x
etc.) para el registro general de declaracionesseq
es un comando externo altamente no estándar y no debe usarse de esta manera. Si está usando bash
, haga algo como for x in {1..10}
, o en su for ((x=1; x<=10; x++))
lugar.
Para engañar bash
y pensar que está en modo interactivo (aunque stdout
no se envía a una terminal), puede usar el script
comando ya mencionado .
(
exec 1> >(tee bashlog.txt) 2>&1
script -q /dev/null /bin/bash -l
)
# alternative without script command
(
# bash: no job control in this shell
exec 1> >(tee bashlog.txt) 2>&1
/bin/bash -il
)
La forma más sencilla de hacerlo sería
bash -i >/tmp/logfile 2>&1
Bash escribirá todo /tmp/logfile
y seguirá ejecutando comandos a medida que los escriba, pero no se mostrará nada en el terminal. Puede hacer que salga justo cuando salga de su sesión de terminal, presionando Ctrl+ Do escribiendo exit
.
Tenga en cuenta que si ejecuta lo mismo sin stderr
redireccionamiento, solo tendrá el mensaje de saludo registrado en el archivo, todo lo demás funcionará en su terminal actual. Entonces, la respuesta a su pregunta sobre la secuencia a la que bash genera su solicitud (y todos los siguientes comandos) parece ser: stderr .
Ah, sí, y el -i
parámetro simplemente obliga a bash a ejecutarse en modo interactivo. No escuches a esas personas, no necesitas ningún truco de magia para hacerlo;)
<sub>
para formatear. Acabo de aprender algo nuevo hoy. : D
La solicitud se escribe en stderr como truss (en Solaris aquí) muestra:
$ truss -ft write -p 10501
10501: write(2, " d", 1) = 1
10501: write(2, " a", 1) = 1
10501: write(2, " t", 1) = 1
10501: write(2, " e", 1) = 1
10501: write(2, "\n", 1) = 1
10521: write(1, " S a t u r d a y , S e".., 46) = 46
10501: Received signal #18, SIGCLD [caught]
10501: siginfo: SIGCLD CLD_EXITED pid=10521 status=0x0000
10501: write(2, " $ ", 2) = 2