Vi esta línea en un guión:
DEVICE=`dialog --inputbox "Festplatten-Laufzeit auslesen. Gebe Sie das
gewünschte Device an: " 0 70 "" 3>&1 1>&2 2>&3`
Que es
3>&1 1>&2 2>&3
¿haciendo? Sé que 1 = stdout y 2 = stderr, pero ¿para qué sirven 3
y &
para qué?
Respuestas:
Los números son descriptores de archivo y solo los primeros tres (comenzando con cero) tienen un significado estandarizado:
Por lo tanto, cada uno de estos números en su comando se refiere a un descriptor de archivo. Puede redirigir un descriptor de archivo a un archivo con
>
o redirigirlo a otro descriptor de archivo con>&
El
3>&1
en su línea de comando creará un nuevo descriptor de archivo y lo redirigirá a1
cuál esSTDOUT
. Ahora1>&2
redirigirá el descriptor de archivo 1STDERR
y2>&3
redirigirá el descriptor de archivo 2 a 3, que esSTDOUT
.Así que básicamente cambiaste
STDOUT
ySTDERR
estos son los pasos:Ahora, si el programa imprime algo en el descriptor de archivo 1, se imprimirá en el descriptor de archivo 2 y viceversa.
fuente
Está intercambiando
stdout
ystderr
.>name
significa redirigir la salida al archivoname
.>&number
significa redirigir la salida al descriptor de archivonumber
.Por lo tanto,
&
se necesita para decirle al shell que quiere decir un descriptor de archivo, no un nombre de archivo.Un descriptor de archivo es un número que se refiere a un archivo ya abierto. Los estándares son
0
para entrada estándar,1
para salida estándar o2
para error estándar. También puede usar cualquier otro número, que creará un nuevo descriptor de archivo, al igual que cuando crea una nueva variable convar=value
.Por defecto, tanto el descriptor de archivo
1
como el de2
ir a/dev/tty
, por lo que si se ejecutasomecommand 3>&1 1>&2 2>&3
en un nuevo shell, no cambia nada (excepto que ahora tiene un descriptor de archivo número 3).Pero si en algún lugar anterior en el script hace una redirección usando exec (por ejemplo
exec 2>error.log
), o el script se ejecuta con una línea de comando que incluye la redirección (por ejemplo./thescript 2>error.log
), entonces intercambiar stdout y stderr hará algo.En su caso específico, el comando que tiene sus stdout y stderr intercambiados es
dialog
. Mirando su página de manual , veoEntonces, tal vez la persona que escribió el guión quiere
dialog
que vaya a la salida enstdout
lugar destderr
por alguna razón.Ver también Orden de redireccionamientos
fuente
El guionista definió fd 3 como:
Abra "File.txt" y asígnele fd 3. Descriptores máximos de archivo: 255
Lee solo 4 caracteres.
Escribe un punto decimal allí.
Cerrar fd 3.
==> 1234.67890
fuente