Sé libre de divulgar nuestro espacio y códigos con otro, necesitamos tu ayuda para hacer crecer esta comunidad.
Los números son descriptores de archivos y solo los tres primeros (que comienzan con cero) tienen un significado estandarizado:
0 - stdin
1 - stdout
2 - stderr
Entonces, 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á a 1
cual es STDOUT
. Ahora 1>&2
redirigirá el descriptor de archivo 1 a STDERR
y 2>&3
redirigirá el descriptor de archivo 2 a 3 que es STDOUT
.
Así que básicamente cambiaste STDOUT
y STDERR
, estos son los pasos:
- Cree un nuevo fd 3 y apúntelo al fd 1
- Redirigir el descriptor de archivo 1 al descriptor de archivo 2. Si no hubiéramos guardado el descriptor de archivo en 3, perderíamos el objetivo.
- Redirija el descriptor de archivo 2 al descriptor de archivo 3. Ahora se intercambian los descriptores de archivo uno y dos.
Ahora, si el programa imprime algo en el descriptor de archivo 1, se imprimirá en el descriptor de archivo 2 y viceversa.
esta cambiando stdout
y stderr
.
>name
significa redirigir la salida al archivo name
.
>&number
significa redirigir la salida al descriptor de archivo number
.
Entonces el &
es necesario para decirle al shell que se refiere a un descriptor de archivo, no a un nombre de archivo.
Un descriptor de archivo es un número que hace referencia a un archivo ya abierto. Los estandar son 0
para entrada estándar, 1
para salida estándar o 2
para el 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 con var=value
.
De forma predeterminada, tanto el descriptor de archivo 1
y 2
ir /dev/tty
, así que si corres somecommand 3>&1 1>&2 2>&3
en un shell nuevo, 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 (p. ej. ./thescript 2>error.log
), luego intercambiar stdout y stderr hará algo.
En su caso específico, el comando que tiene su stdout y stderr intercambiado es dialog
. Mirando su página man, veo
Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error
así que tal vez la persona que escribió el guión quiera dialog
salida para ir a stdout
en vez de stderr
por alguna razón.
Ver también Orden de redirecciones
El guionista definió fd 3 como:
exec 3<> File.txt
Abra “File.txt” y asígnele fd 3. Máximo de descriptores de archivo: 255
read -n 4 <&3
Lee solo 4 caracteres.
echo -n . >&3
Escribe un punto decimal allí.
exec 3>&-
Cerrar fd 3.
cat File.txt
==> 1234.67890
Puntuaciones y comentarios
Si crees que ha sido provechoso nuestro artículo, sería de mucha ayuda si lo compartieras con otros programadores así nos ayudas a difundir nuestro contenido.