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)
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
)
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;)
+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 1050110501: write(2," d",1)=110501: write(2," a",1)=110501: write(2," t",1)=110501: write(2," e",1)=110501: write(2,"\n",1)=110521: write(1," S a t u r d a y , S e"..,46)=4610501:Received signal #18, SIGCLD [caught]10501: siginfo: SIGCLD CLD_EXITED pid=10521 status=0x000010501: write(2," $ ",2)=2
seq
es un comando externo altamente no estándar y no debe usarse de esta manera. Si está usandobash
, haga algo comofor x in {1..10}
, o en sufor ((x=1; x<=10; x++))
lugar.Para engañar
bash
y pensar que está en modo interactivo (aunquestdout
no se envía a una terminal), puede usar elscript
comando ya mencionado .fuente
La forma más sencilla de hacerlo sería
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 escribiendoexit
.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;)fuente
<sub>
para formatear. Acabo de aprender algo nuevo hoy. : DLa solicitud se escribe en stderr como truss (en Solaris aquí) muestra:
fuente