EDITAR

EDITAR

EDITAR

Consulte no solo la respuesta aceptada sino también las demás.

Pregunta

¿Por qué no funciona la redirección de STDOUT y STDERR al mismo archivo, aunque parece igual que 1>[FILENAME] 2>&1?

Aquí hay un ejemplo:

perl -e 'print "1\n" ; warn "2\n";' 1>a.txt 2>a.txt
cat a.txt
# outputs '1' only.

¿Bien por qué? Pensé que esto funciona porque... STDOUT se redirige a a.txt y también STDERR. ¿Qué pasó con STDERR?

Respuesta1

Ambas redirecciones truncarán el archivo, por lo que la segunda (en orden cronológico de ejecución) sobrescribirá la primera. Intentar

rm a.txt ; touch a.txt ; perl -e 'print "1\n" ; warn "2\n";' 1>>a.txt 2>>a.txt

O simplemente use el mismo descriptor de archivo

perl -e 'print "1\n" ; warn "2\n";' 1>a.txt 2>&1

Respuesta2

Con 1>a.txt 2>&1, el descriptor de archivo n.° 1 esduplicadoa 2. Ambos hacen referencia al mismo "archivo abierto" y ambos comparten la posición actual y el modo r/w. (En realidad, no hay ninguna diferencia entre usar 2>&1 y 2<&1.)

Con 1>a.txt 2>a.txt, ambos descriptores de archivos sonabierto de forma independientey tener posiciones de cursor separadas. (El archivo también se trunca dos veces). Si escribe "Hola" en el fd #1, su posición avanza al byte 5, pero el fd #2 permanece en el byte 0. La impresión en el fd #2 simplemente sobrescribirá los datos comenzando desde 0. .

Esto es fácil de ver si la segunda escritura es más corta:

$ perl -e 'STDOUT->print("abcdefg\n"); STDOUT->flush; STDERR->print("123");' >a.txt 2>a.txt

$ cat a.txt 
123defg

Tenga en cuenta que Perl tiene almacenamiento en búfer interno, por lo que en este ejemplo es necesario un vaciado() explícito para garantizar que los datos de fd #1 se escriban antes que los datos de fd #2. De lo contrario, las corrientes se eliminarían en un orden impredecible al salir.

A modo de comparación, si los descriptores de archivos se comparten, las escrituras simplemente se suceden entre sí:

$ perl -e 'STDOUT->print("abcdefg\n"); STDOUT->flush; STDERR->print("123");' >a.txt 2>&1

$ cat a.txt 
abcdefg
123

información relacionada