En este hilo SO y en algunos otros hilos, he visto los siguientes comandos para redirigir stdouty stderra 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 stdouty stderra 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 stderra las stdoutcuales 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 bashyzsh
Pero:
Solo >&funciona en cshotcsh
[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 kshsolo 2>&1obras.
$ ./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 zshsecció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 > filelo haría en el caso de STDIN solamente.
Sin embargo , la bashsección de redirecciones manuales agrega que:
De las dos formas, se prefiere la primera. Esto es semánticamente equivalente a
>word 2>&1Al 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 bashguión.
>> logfile 2>&1y &>>equivalencia (agregar)Aquí, logfileno se sobrescribe, sino que se abre para escribir al final del archivo, es decir, modo anexar ( O_APPEND).
El equivalente en ambos {ba,z}shes:
command1 &>> logfile
En bash:
El formato para agregar salida estándar y error estándar es:
&>>wordEsto 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.)
zshpermite ambos &>>y >>&formas.