Cuando desee redirigir stdout y stderr al mismo archivo, puede hacerlo utilizando command 1>file.txt 2>&1
, o command &>file.txt
. Pero, ¿por qué el comportamiento es command 1>file.txt 2>file.txt
diferente de los dos comandos anteriores?
El siguiente es un comando de verificación.
$ cat redirect.sh
#!/bin/bash
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file.txt 2>&1
{ echo -e "output\noutput" && echo -e "error" 1>&2; } 1>file1.txt 2>file1.txt
{ echo -e "error" 1>&2 && echo -e "output\noutput"; } 1>file2.txt 2>file2.txt
{ echo -e "output" && echo -e "error\nerror" 1>&2; } 1>file3.txt 2>file3.txt
{ echo -e "error\nerror" 1>&2 && echo -e "output"; } 1>file4.txt 2>file4.txt
$ ./redirect.sh
$ echo "---file.txt---"; cat file.txt;\
echo "---file1.txt---"; cat file1.txt; \
echo "---file2.txt---"; cat file2.txt; \
echo "---file3.txt---"; cat file3.txt; \
echo "---file4.txt----"; cat file4.txt;
---file.txt---
output
output
error
---file1.txt---
error
output
---file2.txt---
output
output
---file3.txt---
error
error
---file4.txt----
output
rror
En lo que respecta a los resultados, parece que la segunda cadena de eco sobrescribe la primera cadena de eco cuando ejecuta command 1>file.txt 2>file.txt
, pero no sé por qué lo hará. (¿Hay alguna referencia en alguna parte?)
fuente
Usar
>
le dice que sobrescriba el archivo. Como tiene stdout y stderr escribiendo en el archivo en dos operaciones diferentes, la última en escribir sobrescribirá la primera.Tu puedes hacer:
command 1>>file.txt 2>>file.txt
o
command &>file.txt
Solo bash v4 y superior.>>
le dice que agregue el archivo para que no reemplace el resultado de las operaciones anteriores.&>
es solo una forma más fácil de escribir2>&1
fuente
ls 1>&0
yls 0>&0
todavía muestra la salida de ls?>>
obras. ¿Por qué esto no tiene el problema de dos descripciones de archivos con compensaciones independientes? @JdeBP, ¿sabes? Pensé que abrir un archivo en modo agregar era equivalente a abrir en modo de escritura, buscar la posición final y luego no permitir más búsquedas.O_APPEND
.