Qu'est-ce que l'Esperluette indique dans cette commande bash 1 > & 2

Un rapide, 2>&1 redirige stderr vers stdout, mais que signifie l'Esperluette? Je sais que si nous avions 2 > 1 il sortirait dans un fichier nommé 1, Que fait l'Esperluette?

34
demandé sur Benjamin W. 2010-02-26 13:56:02

6 réponses

Il copie le descripteur de fichier 1 vers le descripteur de fichier 2. FD2 est stderr et FD1 est stdout, donc il rend toute sortie à stderr aller à stdout à la place.

17
répondu Ignacio Vazquez-Abrams 2010-02-26 11:01:15

2>&1 redirige l'erreur standard (fichier handle 2) vers le même fichier que la sortie standard (fichier handle 1) est actuellement.

C'est aussi une chose dépendante de la position donc:

prog >x 2>&1 >y

Enverra l'erreur standard à x et la sortie standard à y comme suit:

  • Connectez la sortie standard à x;
  • puis connectez l'erreur standard à la même que la sortie standard actuelle, qui est x;
  • puis Se connecter sortie standard à y;
59
répondu paxdiablo 2013-08-27 12:01:27

L'Esperluette appartient au "1" , donc l'extrait a vraiment trois parties: "2", ">", "&1". Ils signifient, respectivement, " prendre les données du flux de sortie 2 (qui est une erreur standard)"," rediriger", et la cible de redirection, qui est le flux de sortie 1. Donc " & " ici vous permet de rediriger vers un flux existant, plutôt que vers un fichier.

17
répondu sleske 2010-02-26 11:02:09

Le & dans &1 duplique le descripteur de fichier 1. Le descripteur dupliqué ne se comporte pas comme une copie, mais comme un alias de l'ancien. La duplication de 1 permet de rediriger plusieurs flux vers 1 sans s'écraser les uns les autres.

Exemple: (non &)

$ ls existing-file non-existent-file > tmp 2> tmp 
$ cat tmp
existing-file
nt-file: No such file or directory

Notez que 1 a écrasé ce que 2 a écrit. Mais pas quand nous utilisons &:

$ ls existing-file non-existent-file > tmp 2>&1 
$ cat tmp
ls: non-existent-file: No such file or directory
existing-file

Un descripteur de fichier est un handle vers un fichier (ou une autre ressource d'entrée / sortie, telle prise réseau). Lorsque 1 et 2 sont redirigés séparément vers tmp (comme dans le premier exemple), ils déplacent leur pointeur de fichier tmp indépendamment. C'est pourquoi les descripteurs de fichiers se sont écrasés.

Selon la page de manuel Linux :

[descripteurs de fichier dupliqués] se réfèrent à la même description de fichier ouvert et ainsi partager le décalage du fichier et les indicateurs d'état du fichier; par exemple, si le décalage du fichier est modifié en utilisant lseek (2) sur descripteur, le décalage est également modifié pour l'autre.

Notez que même si & agit comme un alias, 2>&1 signifie que la redirection 2 dans le flux 1 dans actuellement pointant vers. Lorsque 1 est redirigé vers autre chose, 2 pointe vers le même fichier qu'il a fait indépendamment de 1.

Observer:

$ ls existing-file non-existent-file > tmp 2>&1 > tmp1
$ cat tmp1
existing-file
$ cat tmp
ls: non-existent-file: No such file or directory
14
répondu Rose Perrone 2016-07-04 21:44:09

À Partir de info bash:

3.6.7 Duplicating File Descriptors
----------------------------------

The redirection operator
     [N]<&WORD
   is used to duplicate input file descriptors.  If WORD expands to one
or more digits, the file descriptor denoted by N is made to be a copy
of that file descriptor.  If the digits in WORD do not specify a file
descriptor open for input, a redirection error occurs.  If WORD
evaluates to `-', file descriptor N is closed.  If N is not specified,
the standard input (file descriptor 0) is used.

   The operator
     [N]>&WORD
   is used similarly to duplicate output file descriptors.  If N is not
specified, the standard output (file descriptor 1) is used.  If the
digits in WORD do not specify a file descriptor open for output, a
redirection error occurs.  As a special case, if N is omitted, and WORD
does not expand to one or more digits, the standard output and standard
error are redirected as described previously.

Donc 2>&1 duplique fd 1 sur fd 2.

7
répondu Douglas Leeder 2010-02-26 11:00:51

L'Esperluette ne fait rien-c'est le caractère de l'opérateur 2>&1 plutôt que d'être une chose à part entière.

Bash prend en charge plusieurs opérateurs de redirection , l'opérateur 2>&1 ou l'opérateur &> lient les flux du processus avant ou après la redirection.

0
répondu Pete Kirkham 2015-11-04 21:44:36