¿En qué transmisión escribe Bash su aviso?

8

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?

Gilles 'SO- deja de ser malvado'
fuente

Respuestas:

9

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

sehe
fuente
Añadido consejos sobre cómo conseguir potencialmente más salida de fiesta en una tubería
sehe
seqes 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.
Chris Down
@ Chris: buen punto, gracias por el
aviso
2

Para engañar bashy pensar que está en modo interactivo (aunque stdoutno se envía a una terminal), puede usar el scriptcomando 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
)

fuente
2

La forma más sencilla de hacerlo sería

bash -i >/tmp/logfile 2>&1

Bash escribirá todo /tmp/logfiley 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 stderrredireccionamiento, 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 -iparámetro simplemente obliga a bash a ejecutarse en modo interactivo. No escuches a esas personas, no necesitas ningún truco de magia para hacerlo;)

rozcietrzewiacz
fuente
+1 para usar <sub>para formatear. Acabo de aprender algo nuevo hoy. : D
Chris K
2

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
jlliagre
fuente