Diferencias de redireccionamiento entre &>> & y 2> & 1

12

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
Amelio Vazquez-Reina
fuente
1
Los dos últimos son equivalentes: stackoverflow.com/q/11255447/1032785
jordanm

Respuestas:

7

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).

Sree
fuente
1
¿Qué quiso decir sh? Si es shell POSIX, &>y >&no funcionará.
Cuonglm
Lamentablemente, la primera afirmación es objetivamente incorrecta. Vea mi respuesta para clobber vs append.
Tom Hale
1

&>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>&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 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:

&>>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.)

zshpermite ambos &>>y >>&formas.

Tom Hale
fuente