
"ls -l | wc -l" genera "1+nro. archivo/directorios" (uno extra para la primera línea).
Sin embargo, cuando ejecuto el comando ls -l | wc -l > temp (cuando la salida se redirige a un nuevo archivo temporal). El valor almacenado en el archivo temporal es 1 más que el valor generado sin redirección. Supongo que se debe al nuevo archivo "temp" creado, pero el archivo temporal debería haberse creado después de ejecutar el comando ls -l y, por lo tanto, la salida debería ser la misma que la salida sin redirección.
Alguien por favor ayuda
Respuesta1
Este es un comportamiento perfectamente normal.
Lo que sucede es que el shell (sh, bash, csh, ksh, lo que sea) lee primero la línea de comando completa.
Luego construye los procesos, canalizaciones y archivos de redirección enorden de derecha a izquierday solo entonces ejecuta los comandos reales.
Entonces, el archivo de redirección (temp) se crea ANTES de ejecutar el comando ls.
Tiene que serlo, porque el identificador de archivo asociado con "temp" debe estar disponible para usarse como destino para la salida de wc, antes de que wc se inicie realmente.
El comando wc, a su vez, debe configurarse antes de que la salida de ls pueda adjuntarse al identificador de archivo que será la entrada para wc.
Aunque parezca un poco poco lógico al principio, esto tiene mucho sentido cuando se comprende la forma en que los shells construyen su secuencia de comandos.
Respuesta2
En realidad, el shell crea el temp
archivo antes de comenzar a ejecutar los comandos, por lo que siempre verá el temp
archivo contado. Si no desea que se cuente, coloque el archivo temporal en otro lugar, como quizás en /tmp
. O simplemente resta uno del conteo que obtienes.