Saltar al contenido

¿Qué hace “3>&1 1>&2 2>&3” en un script?

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:

  1. Cree un nuevo fd 3 y apúntelo al fd 1
  2. 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.
  3. 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 dialogsalida 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *