Para un contexto adicional, hice esta pregunta antes, y pensé que entendía las cosas, pero ya no.
Sé que echo
ignora stdin
. Yo sé que stdin
, stderr
y stdout
existo y, en este contexto, no sé que las "cosas" que no sean éstos existen.
Entonces, si echo
ignora stdin
, ¿de dónde obtiene su entrada? Parece stdin
, stdout
y stderr
no cuentan toda la historia.
echo
obtiene toda la información que necesita de los argumentos que se le pasan.echo
obtiene información del argv (argumentos de línea de comando, una de las propiedades del proceso).Respuestas:
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
ybar
deecho foo bar
) y las cadenas de entorno (elFOO=bar
deenv - 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 conmemfd_create
.fuente
echo foo bar
, esto se ingresa de acuerdo con la definición del diccionario. Ahora los recursos mencionanstdin
,stderr
ystdout
nada más (no se cuenta toda la historia) y no sé cómo dar sentido a esto.foo
ybar
hacia dónde van?