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

Respuestas:

77

Los números son descriptores de archivo y solo los primeros tres (comenzando con cero) tienen un significado estandarizado:

0 - stdin
1 - stdout
2 - stderr

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>&1en su línea de comando creará un nuevo descriptor de archivo y lo redirigirá a 1cuál es STDOUT. Ahora 1>&2redirigirá el descriptor de archivo 1 STDERRy 2>&3redirigirá el descriptor de archivo 2 a 3, que es STDOUT.

Así que básicamente cambiaste STDOUTy STDERRestos son los pasos:

  1. Cree un nuevo fd 3 y apúntelo al fd 1
  2. Redirija 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. Redirigir el descriptor de archivo 2 al descriptor de archivo 3. Ahora los descriptores de archivo uno y dos se cambian.

Ahora, si el programa imprime algo en el descriptor de archivo 1, se imprimirá en el descriptor de archivo 2 y viceversa.

Ulrich Dangel
fuente
Ha dicho "El 3> & 1 en su línea de comando creará un nuevo descriptor de archivo y lo redirigirá a 1, que es STDOUT". ¿Pero no significa 1 STDIN?
sofs1
19

Está intercambiando stdouty stderr.

>namesignifica redirigir la salida al archivo name.

>&numbersignifica redirigir la salida al descriptor de archivo number.

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 0para entrada estándar, 1para salida estándar o 2para 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.

Por defecto, tanto el descriptor de archivo 1como el de 2ir a /dev/tty, por lo que si se ejecuta somecommand 3>&1 1>&2 2>&3en 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 , veo

Some widgets, e.g., checklist, will write text to dialog's output.
Normally that is the standard error

Entonces, tal vez la persona que escribió el guión quiere dialogque vaya a la salida en stdoutlugar de stderrpor alguna razón.

Ver también Orden de redireccionamientos

Mikel
fuente
1

El guionista definió fd 3 como:

exec 3<> File.txt

Abra "File.txt" y asígnele fd 3. Descriptores máximos 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

Jonathan Jackson
fuente