Estaba un poco confundido por esta expresión:
gcc -c -g program.c >& compiler.txt
Sé &>filename
que 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 M
y N
son descriptores de archivo.
En el fragmento de arriba, ¿ M=1
y 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?
fuente
>&
es la sintaxis utilizada por csh y tcsh para redirigir tanto stdout como stderr. Probablemente por eso bash lo acepta.&>word
y>word 2>&1
son semánticamente equivalentes? El antecedente de "Esto" no me queda claro.&>word
,>word 2>&1
, y>&word
son exactamente los mismos.>
solo redirige la salida estándar.>
no redirige el error. (Probablemente debería redirigir mis comentarios futuros a/dev/null
)&>
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
> file
lo haría en el caso exclusivo de STDIN.Sin embargo , la
bash
sección Redirecciones manuales agrega que:(Nota: en
zsh
ambos son equivalentes ).Es una muy buena práctica obtener la memoria de los dedos en la primera forma (
&>
), porque:Usar
&>>
como>>&
no es proporcionado porbash
(agregar)Solo hay un formulario de anexo:
Nota:
&>
over>&
en la sección anterior se recomienda nuevamente dado que solo hay una forma de agregarbash
.zsh
permite ambos&>>
y>>&
formas.fuente
&
un carácter especial que el intérprete de shell convierte a 1 y 2?