Aparentemente no conozco todos los destinos de salida que están disponibles para su uso. Sé sobre stdout
( &1
) y stderr
( &2
). Sin embargo, después de redirigir ambos descriptores, a veces aún obtengo algo de salida en mi consola.
El ejemplo más fácil que se me ocurre es GNU Parallel; Cada vez que lo uso, veo un aviso de cita. Incluso cuando lo hago &2>1 > file
, todavía veo el aviso.
Y lo mismo se aplica a emerge
: cuando ejecuto emerge y hay algunos problemas, algunas informaciones no se imprimen en stdout
ni stdin
, ya que las redirijo y aún así pasan.
Principalmente resuelvo estos problemas usando script
, pero todavía me pregunto qué está causando este problema.
bash
terminal
io-redirection
MatthewRock
fuente
fuente
/dev/tty
.parallel
:mkdir ~/.parallel; touch ~/.parallel/will-cite
deshabilitará el mensaje molesto. Alternativamente, busque otras implementaciones deparallel
.parallel
como ejemplo.Respuestas:
La sintaxis que usó es incorrecta.
se dividirá como
Esta voluntad:
cmd
como un trabajo en segundo plano sin redireccionamientosstderr
a un archivo literalmente llamado1
y redirigirástdout
afile
La sintaxis que desea es:
El orden de las operaciones es importante. Esta voluntad:
stdout
afile
stderr
a&1
- es decir, el mismo identificador de archivo questdout
El resultado es que ambos
stderr
ystdout
serán redirigidos afile
.En
bash
, una sintaxis más simple no estándar (y, por lo tanto, no la recomiendo, por razones de portabilidad)cmd &> file
hace lo mismo.fuente
/dev/tty
, pero espero que esto no suceda con demasiada frecuencia (si es que lo hace).at
comando en su máquina y tiene privilegios para usarlo, puede ejecutar el comando a través deat now
. Vea la página de manual para más detalles. Esto ejecutará el comando a través de un mecanismo de proceso por lotes y el proceso nunca tendrá un tty para escribir. Pero, en general, no me preocuparía por este caso límite. Por lo general, solo los procesos que requieren interacción y deliberadamente necesitan mostrar cosas a los usuarios a pesar de la redirección/dev/tty
.Hay dos problemas
El primero es que el orden importa, el segundo es
/dev/tty
.Usemos este script como un script de ejemplo del que queremos capturar resultados:
test.sh
:Ahora veamos las salidas de los comandos:
./testmyscript.sh 2>&1 >/dev/null
:Debido a que el orden de evaluación es de izquierda a derecha, primero obtenemos "redirigir
stderr
a dondestdout
sea que salga (por lo tanto, salida de consola)". Luego tenemos "redirigirstdout
a/dev/null
. Terminamos con una situación como esta:stdout
->/dev/null
stderr
-> consolaEntonces lo hacemos bien:
./testmyscript.sh >/dev/null 2>&1
Y obtenemos:
ttdada
.Ahora hacemos "Redirigir
stdout
a/dev/null
" y luego "Redirigir stderr a donde apunta stdout" (entonces,/dev/null
). ¡Hurra!Sin embargo, todavía tenemos un problema; programa imprime a
/dev/tty
. Ahora no sé cómo solucionar este tipo de comportamiento, por lo que es muy probable que lo necesitesscript
, pero espero que este comportamiento no ocurra con demasiada frecuencia.fuente