En este hilo SO y en algunos otros hilos, he visto los siguientes comandos para redirigir stdout
y stderr
a un archivo.
¿Son todos equivalentes? ¿Hay alguna diferencia entre ellos?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
En este hilo SO y en algunos otros hilos, he visto los siguientes comandos para redirigir stdout
y stderr
a un archivo.
¿Son todos equivalentes? ¿Hay alguna diferencia entre ellos?
command1 >> logfile 2>&1
command &> logfile
command >& logfile
Respuestas:
Como has etiquetado zsh
, déjame decirte que las 3 redirecciones funcionan exactamente de la misma manera. Como puede haber leído en las publicaciones duplicadas (la del comentario y la de su publicación), todas ellas redirigen stderr
a las stdout
cuales se redirige al archivo 'archivo de registro' (es decir, el archivo de registro contendrá tanto la salida como los errores )
Pero su comportamiento cambia MUCHO dependiendo del shell en el que se encuentre.
Los tres estilos de redireccionamiento funcionan bien de la misma manera bash
yzsh
Pero:
Solo >&
funciona en csh
otcsh
[soum@server ~]$ ./test.sh > logfile 2>&1
Ambiguous output redirect.
[soum@server ~]$ ./test.sh &> logfile
Invalid null command.
[soum@server ~]$ ./test.sh >& logfile
[soum@server ~]$ echo $SHELL
/bin/tcsh
[soum@server ~]$
En ksh
solo 2>&1
obras.
$ ./test.sh >& logfile
-ksh: logfile: bad file unit number
$ ./test.sh &> logfile
[1] 23039
$ 1 2 3 4 5 6 logfile test.sh
ls: cannot access ttr: No such file or directory
[1] + Done(2) ./test.sh &> logfile
No me gusta ksh
. Si bien >&
solo dio un error, el &>
fondo incluyó una parte del comando y vació el archivo de registro (si no está vacío).
sh
? Si es shell POSIX, &>
y >&
no funcionará.
&>
y >&
semi-equivalencia (clobber)La zsh
sección de redirecciones manuales dice que:
&>
>&
son equivalentes
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 de STDIN solamente.
Sin embargo , la bash
sección de 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, la palabra no puede expandirse a un número o
-
. Si es así, se aplican otros operadores de redireccionamiento (consulte Duplicar descriptores de archivo a continuación) por razones de compatibilidad.
Entonces, mientras etiqueta zsh
, probablemente sea una buena práctica obtener memoria de dedo en la primera forma si alguna vez se escribe un bash
guión.
>> logfile 2>&1
y &>>
equivalencia (agregar)Aquí, logfile
no se sobrescribe, sino que se abre para escribir al final del archivo, es decir, modo anexar ( O_APPEND
).
El equivalente en ambos {ba,z}sh
es:
command1 &>> logfile
En bash
:
El formato para agregar salida estándar y error estándar es:
&>>word
Esto es semánticamente equivalente a
>>word 2>&1
(Ver Duplicar descriptores de archivos a continuación).
(Nota: el uso de clobber &>
más >&
en la sección anterior de nuevo se recomienda dado que sólo hay un camino para anexar en bash
.)
zsh
permite ambos &>>
y >>&
formas.