Sé que env
es un comando de shell, se puede usar para imprimir una lista de las variables de entorno actuales. Y hasta donde yo entiendo, RANDOM
también es una variable de entorno.
Entonces, ¿por qué, cuando inicio env
en Linux, la salida no incluye RANDOM
?
shell
environment-variables
mcmxciv
fuente
fuente
env
no es un comando de shell ya que generalmente no está integrado en el shell.declare -x
es el equivalente en un shell incorporado.Respuestas:
RANDOM
No es una variable de entorno. Es una variable de shell mantenida por algunos shells. Generalmente no se exporta por defecto. Es por eso que no aparece en la salida deenv
.Una vez que se ha utilizado al menos una vez, sería aparecer en la salida de
set
, que, por sí mismo, las listas de las variables de shell (y funciones) y sus valores en la sesión shell actual. Este comportamiento depende del shell y el usopdksh
en OpenBSDRANDOM
se enumeraríaset
incluso si no se usaba anteriormente.El resto de esta respuesta se refiere a lo que podría esperarse que suceda si
RANDOM
se exporta (es decir, se convierte en una variable de entorno).Exportarlo lo
export RANDOM
convertiría en una variable de entorno, pero su uso estaría muy limitado ya que su valor en un proceso secundario sería "aleatorio pero estático" (lo que significa que sería un número aleatorio inmutable). El comportamiento exacto difiere entre los depósitos.Estoy usando
pdksh
OpenBSD en el ejemplo a continuación y obtengo un nuevo valor aleatorio en cadaawk
ejecución (pero el mismo valor cada vez dentro de la mismaawk
instancia). Utilizandobash
, obtendría exactamente el mismo valor aleatorio en todas las invocaciones deawk
.En
bash
, el valor exportado deRANDOM
permanecería estático independientemente del uso deRANDOM
en el shell (donde cada uso de$RANDOM
todavía daría un nuevo valor).Esto se debe a que cada referencia a la variable de shell
RANDOM
enbash
hace que el shell acceda a suget_random()
función interna para darle a la variable un nuevo valor aleatorio, pero el shell no actualiza la variable de entornoRANDOM
. Esto es similar en comportamiento como con otras dinámicasbash
variables, tales comoLINENO
,SECONDS
,BASHPID
etc.Para actualizar la variable de entorno
RANDOM
enbash
, habría que asignarle el valor de la variable de shellRANDOM
y reexportación que:Para mí no está claro si esto tendría el efecto secundario adicional de volver a sembrar el generador de números aleatorios
bash
o no (pero una suposición educada sería que no lo hace).fuente
RANDOM
Incluso tiene un valor antes de usarlo? Siempre supuse que solo estaba poblado cuando se lo llamaba.export RANDOM
, odeclare -p RANDOM
, lo que parece, así que no estoy seguro de si se trata de cualquier uso que no existe antes de que se hace referencia ...No todas las variables que se configuran en su sesión de shell son variables de entorno. "Variables de entorno" se refiere solo a aquellas variables que se han exportado al entorno utilizando la función
export
integrada. Elenv
comando solo imprime tales variables de entorno . Por ejemplo:Si desea ver todas las variables establecidas en su sesión, independientemente de si se han exportado, puede usar
set
:El
set
builtin también devuelve funciones, por lo que para ver solo las variables, puede usar:Finalmente, la
RANDOM
variable es especial porque solo se le asigna un valor cuando se hace referencia a ella. Esto se menciona en bash (1) :Entonces, incluso si fuera una variable de entorno como pensaba, no se habría mostrado
env
ya que no se configuraría hasta la primera vez que la llamó. Por eso también no se muestra enset
:fuente
set | grep RAN
. No lo hubiera esperado. FWIW, creo que la documentación no puede predecirlo.La mayoría de los shells tendrán una serie de otras variables establecidas o utilizadas por el shell que no se exportan a los procesos secundarios de forma predeterminada.
En Bash, hay algunos obviamente específicos de Bash:
Entonces hay otros más convencionales como
OPTIND
yOPTERR
(usado porgetopts
), yPS2
,PS3
(las indicaciones secundarias) e incluso otra variable "mágica":SECONDS
(muestra el tiempo en segundos desde el inicio de la concha)En Bash, puede ver todas las variables y su estado de exportación con
declare -p
. Los marcados con-x
se exportan, los que no lox
están. (Algunos tendrán otras banderas comoi
para entero or
para solo lectura).En Zsh o ksh93, puede usar
typeset -p
, aunque Zsh marca las variables exportadas cambiandotypeset
aexport
en la salida, en lugar de usar banderas.export
por sí solo también mostraría todas las variables exportadas, pero ese es el mismo resultado que obtienes al ejecutarenv
.fuente
Si buscas esto en Google, los documentos indican lo siguiente:
Si lo usa
strace
, puede ver que la$RANDOM
"variable" se pasa directamente a los comandos como si fuera una variable de shell ordinaria o una variable de entorno, pero es solo una función interna que está integrada en el shell, Bash, que está haciendo la expansión.vs. esta variable regular:
La variable no se pasa como referencia.
Referencias
fuente
$RANDOM
o a$SOMEVAR
través de un argumento de línea de comando, y no como una variable de entorno? Necesitaríasexport
ambos para pasarlos por el entorno.strace
salida no parece captar la función interna ejecutada por el shell. En ambos casos, la variable ya se ha expandido en la primera línea destrace
. No entiendo a qué diferencia estás apuntando. ¿Qué me estoy perdiendo?$RANDOM
expansión se realiza internamente al shell. Básicamente es la confirmación de que el shell está determinando el valor y no pasando una referencia a una variable. El shell cuando expande la línea de comando para ejecutar análisis$RANDOM
y pasa el formulario expandido aecho
.