¿Qué significa> &?

81

Estaba un poco confundido por esta expresión:

gcc -c -g program.c >& compiler.txt

&>filenameque redirigirá tanto stdout como stderr al archivo filename. Pero en este caso, el ampersand está después del signo mayor que. Parece que tiene el formato M>&N, donde My Nson descriptores de archivo.

En el fragmento de arriba, ¿ M=1y N='compiler.txt'? ¿En qué se diferencia exactamente de:

gcc -c -g program.c > compiler.txt     (ampersand removed)

Tengo entendido que cada archivo abierto está asociado con un descriptor de archivo mayor que 2. ¿Es correcto?

Si es así, ¿es un nombre de archivo intercambiable con su descriptor de archivo como destino de la redirección?

contrapositivo
fuente

Respuestas:

93

Este es el mismo que &>. Desde la página de manual de bash:

Redirigir la salida estándar y el error estándar Esta construcción permite redirigir tanto la salida estándar (descriptor de archivo 1) como la salida de error estándar (descriptor de archivo 2) al archivo cuyo nombre es la expansión de palabra.

There are two formats for  redirecting  standard  output  and  standard
error:

       &>word
and
       >&word

Of the two forms, the first is preferred.  This is semantically equiva-
lent to

       >word 2>&1
Jordanm
fuente
7
Me siento tonto. Pasé mucho tiempo leyendo otras fuentes y estaba allí mismo en la página de manual.
contrapositivo
3
>&es la sintaxis utilizada por csh y tcsh para redirigir tanto stdout como stderr. Probablemente por eso bash lo acepta.
Keith Thompson
4
¿Significa esto que &>wordy >word 2>&1son semánticamente equivalentes? El antecedente de "Esto" no me queda claro.
geneorama
8
@geneorama &>word, >word 2>&1, y >&word son exactamente los mismos.
jordanm
1
Ahora me doy cuenta de que antes cometí un error basado en lo que leí en otros lugares. >solo redirige la salida estándar. >no redirige el error. (Probablemente debería redirigir mis comentarios futuros a /dev/null)
geneorama
8

&>vs >&: la versión preferida es &>(clobber)

Respecto a:

  • &>
  • >&

ambos golpearán el archivo; truncarán el archivo a 0 bytes antes de escribir en él, tal como > filelo haría en el caso exclusivo de STDIN.

Sin embargo , la bashsección Redirecciones manuales agrega que:

De las dos formas, se prefiere la primera. Esto es semánticamente equivalente a

>word 2>&1

Al usar la segunda forma, es posible que la palabra no se expanda a un número o -. Si es así, se aplican otros operadores de redirección (consulte Duplicación de descriptores de archivos a continuación) por razones de compatibilidad.

(Nota: en zshambos son equivalentes ).

Es una muy buena práctica obtener la memoria de los dedos en la primera forma ( &>), porque:

Usar &>>como >>&no es proporcionado por bash(agregar)

Solo hay un formulario de anexo:

El formato para agregar salida estándar y error estándar es:

&>>word

Esto es semánticamente equivalente a

>>word 2>&1

(consulte Duplicar descriptores de archivos a continuación).

Nota:

  • El uso de clobber de &>over >&en la sección anterior se recomienda nuevamente dado que solo hay una forma de agregar bash.
  • zshpermite ambos &>>y >>&formas.
Tom Hale
fuente
Esta respuesta es mucho más útil que la respuesta votada a favor.
asesino
entonces, ¿es &un carácter especial que el intérprete de shell convierte a 1 y 2?
Fakher Mokadem
@FakherMokadem No, consulte el manual .
Tom Hale