No estoy seguro de entender la fuente de su confusión, pero tenga en cuenta que en Unix los argumentos de la línea de comandos (el foo
y bar
de echo foo bar
) y las cadenas de entorno (el FOO=bar
de env - FOO=bar printenv
) simplemente son copiados por el núcleo en el espacio de direcciones del proceso, donde simplemente se accede como cualquier otra memoria (a través de punteros, etc.); no se pasan como archivos que podrían ser leídos, escritos o mapeados en memoria por el proceso, como lo son los stdin estándar, stdout, stderr o cualquier descriptor de archivo adicional.
Esta no es una ley de la naturaleza, es solo cómo funciona en Unix. Se podría argumentar que esto es arcaico, inconsistente e ineficiente (se hace una copia de todo el entorno para cada proceso, incluso si se ignora todo o la mayor parte).
Se pueden hacer diferentes arreglos: en el plan9 , las cadenas de entorno son en realidad archivos /env
(lo que también significa que se pueden compartir entre procesos).
Además, se LD_PRELOAD
podría usar un hack en Linux para evitar el límite argv + env al pasar todo a través de un archivo creado con memfd_create
.
echo
obtiene toda la información que necesita de los argumentos que se le pasan.