Que fait “3> & 1 1> & 2 2> & 3” dans un script?

Réponses:

77

Les nombres sont des descripteurs de fichier et seules les trois premières (commençant par zéro) ont une signification normalisée:

0 - stdin
1 - stdout
2 - stderr

Ainsi, chacun de ces numéros dans votre commande fait référence à un descripteur de fichier. Vous pouvez soit rediriger un descripteur de fichier vers un fichier avec, >soit le rediriger vers un autre descripteur de fichier avec>&

La 3>&1dans votre ligne de commande va créer un nouveau descripteur de fichier et le rediriger vers ce 1qui est STDOUT. Maintenant 1>&2, redirige le descripteur de fichier 1 vers STDERRet 2>&3redirigera le descripteur de fichier 2 vers 3 qui est STDOUT.

Donc, fondamentalement, vous avez basculé STDOUTet STDERRvoici les étapes à suivre:

  1. Créer un nouveau disque 3 et le diriger vers le disque 1
  2. Redirige le descripteur de fichier 1 vers le descripteur de fichier 2. Si nous n'avions pas enregistré le descripteur de fichier dans 3, nous perdrions la cible.
  3. Redirige le descripteur de fichier 2 vers le descripteur de fichier 3. Désormais, les descripteurs de fichier un et deux sont permutés.

Maintenant, si le programme imprime quelque chose dans le descripteur de fichier 1, il sera imprimé dans le descripteur de fichier 2 et inversement.

Ulrich Dangel
la source
Vous avez dit "Les 3> & 1 dans votre ligne de commande créeront un nouveau descripteur de fichier et le redirigeront vers 1 qui est STDOUT". Mais 1 ne signifie-t-il pas STDIN?
sofs1
19

C'est échanger stdoutet stderr.

>namesignifie rediriger la sortie vers le fichier name.

>&numbersignifie rediriger la sortie vers le descripteur de fichier number.

Donc, il &est nécessaire de dire au shell que vous voulez dire un descripteur de fichier, pas un nom de fichier.

Un descripteur de fichier est un numéro qui fait référence à un fichier déjà ouvert. Les standards sont 0pour l'entrée standard, 1pour la sortie standard ou 2pour l'erreur standard. Vous pouvez également utiliser n'importe quel autre nombre, ce qui créera un nouveau descripteur de fichier, comme lorsque vous créez une nouvelle variable avec var=value.

Par défaut, les deux descripteurs de fichier 1et 2aller à /dev/tty, de sorte que si vous exécutez somecommand 3>&1 1>&2 2>&3dans un nouveau shell, cela ne change rien (sauf que vous avez maintenant un descripteur de fichier numéro 3).

Mais si quelque part plus tôt dans le script effectue une redirection à l'aide de exec (par exemple exec 2>error.log), ou si le script est exécuté avec une ligne de commande incluant une redirection (par exemple ./thescript 2>error.log), alors permuter stdout et stderr fera quelque chose.

Dans votre cas spécifique, la commande dont les options stdout et stderr sont permutées est dialog. En regardant sa page de manuel , je vois

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

alors, peut-être que la personne qui a écrit le script veut que dialogle résultat soit accessible au stdoutlieu de stderrpour une raison quelconque.

Voir aussi Ordre des redirections

Mikel
la source
1

Le scénariste a défini fd 3 tel que:

exec 3<> File.txt

Ouvrez "File.txt" et affectez-lui le dossier 3. Descripteurs de fichier maximum: 255

read -n 4 <&3

Lire seulement 4 caractères.

echo -n . >&3

Écrivez un point décimal ici.

exec 3>&-

Fermer fd 3.

cat File.txt

==> 1234.67890

Jonathan Jackson
la source