
He llegado a comprender que tenemos dos métodos para redirigir tanto stdout como stderr al mismo archivo. El primer método es:
ls -l /bin > ls-output.txt 2>&1
como autor deeste libroestados: Con este método, realizamos 2 redirecciones, primero redirigimos stdout a ls-output.txt y luego redirigimos stderr (descriptor de archivo 2) a stdout (usando el descriptor de archivo 1).
El orden de las redirecciones es importante.
ls -l /bin 2>&1 >ls-output.txt
redirigiría stderr a la pantalla.
Mi pregunta es: como en muchos lenguajes de programación, ¿el comando se diseñó teniendo en cuenta algunas reglas de asociatividad y precedencia?y¿Cómo leemos el comando mientras lo escribimos en la pantalla?y¿Cuál es la secuencia de ejecución del comando en el backend?
Esto es lo que pienso sobre la secuencia de ejecución: Primero, el comando ls -l /bin
envía su salida a stdout y el error a stderr (cualquiera de esos). Luego, stderr se redirige a stdout (si hay algún error, por ejemplo: si ls -l /binn
se usa). Ahora, la secuencia stdout contiene uno de los dos (ya sea salida o error) que luego redirige al archivo.ls-salida.txt
Respuesta1
Las redirecciones se procesan de izquierda a derecha. Cuando ejecutas:
ls -l /bin >ls-output.txt 2>&1
el shell realiza aproximadamente las siguientes operaciones internamente:
fork(); // Then in the child process:
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
// 2>&1
dup2(1, 2);
Luego ejecuta el ls -l /bin
comando con estos descriptores adjuntos en su lugar. Dado que primero redirige stdout
al archivo, la redirección stderr
hereda esa redirección.
Si tuvieras que escribir
ls -l /bin 2>&1 >ls-output.txt
El orden de las operaciones se invertiría:
// 2>&1
dup2(1, 2);
// >ls-output.txt
fd = open("ls-output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
dup2(fd, 1);
close(fd);
Este se conecta stderr
al original stdout
, que probablemente sea el terminal. Luego redirige stdout
a un archivo; esto no tiene ningún efecto sobre stderr
.