Redirigir la salida estándar y el error estándar a un archivo

Redirigir la salida estándar y el error estándar a un archivo

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.txtredirigirí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 /binenví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 /binnse 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 /bincomando con estos descriptores adjuntos en su lugar. Dado que primero redirige stdoutal archivo, la redirección stderrhereda 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 stderral original stdout, que probablemente sea el terminal. Luego redirige stdouta un archivo; esto no tiene ningún efecto sobre stderr.

información relacionada