Pregunta

ls > ls.out

esto incluirá ls.out en la lista también. Mi entendimiento es: > (el operador de redirección de salida de shell está creando primero un archivo (para tomar el STDOUT) si aún no existe y luego se está ejecutando el comando ls e incluye el archivo ls.out recién creado en la salida. ¿Es esto correcto? Si no es así, ¿puede elaborar el funcionamiento de ese comando?

Similarmente

wc temp > temp

Imprimirá 0 0 0 temp dentro del archivo temporal recién creado.

Este comportamiento de shell es interesante. Me pregunto cómo está funcionando realmente. Por cierto, ambos son ejercicios en el Libro del entorno de programación de Unix. Como mencioné la respuesta anterior, quiero que algún experto corrija mi comprensión.

¿Fue útil?

Solución

Al redirigir la salida estándar con > , el shell creará el archivo (como un archivo vacío) si aún no existe. Además, ese archivo se abre antes de que el shell bifurque y ejecute el comando que se está ejecutando. Cuando haces wc temp > temp , el shell abre el archivo para escribir y luego bifurca y ejecuta wc , pasando sus identificadores de archivo abiertos en el proceso.

Otros consejos

Simplificación excesiva:

ls está mirando el inodo (entrada de directorio) que creó la redirección.

wc puede ver el inodo que creó la redirección, pero cuando mira los contenidos están vacíos porque ( wc ) aún no los ha escrito.

Editar:

Primero, en ambos casos, la redirección ( > ls.out o > temp ) crea un archivo vacío. Se hace una entrada (inodo) en el directorio para apuntar a la ubicación del archivo y contener cierta información al respecto. Vea el artículo de Wikipedia sobre inodes .

A continuación, en el caso de ls , todas las entradas en el directorio, incluyendo la de ls.out que se acaba de crear , se leen y escriben en stdout (que en este caso se convierte en el contenido de ls.out ).

O, en el caso de wc , está contando los recuentos de nueva línea, palabra y byte del archivo creado recientemente llamado temp que está vacío por lo que escribe los recuentos cero en el archivo después de cuenta (nada).

El contenido de los archivos ( temp o ls.out ) no se escriben hasta después de que se haya realizado toda la lectura, por lo que no pueden haberse incluido.

Para una mejor manera de comparar lo que están haciendo ls y wc , pruebe este comando (cuando ls.out no existe):

ls -l > ls.out

Debería ver que el tamaño del archivo para ls.out es cero de acuerdo con la lista contenida dentro ( cat ls.out ), pero si lo hace ls -l ls.out verá que no es cero. Esto corresponde a lo que ves que sucede con wc .

considere wc -l temp > temp

Si temp ya existía y tenía 20 líneas como resultado de cat temp después de ejecutar el comando anterior, será 0 temp.

Creo que esto se debe a que el shell crea una nueva temp vacía, incluso si existiera temp , sobrescribiendo la temp existente y, por lo tanto, cuando wc intente para contar el número de líneas en temp se pone a cero.

En efecto > temp se ejecuta primero con shell y luego se ejecuta wc -l temp .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top