Sé que enves un comando de shell, se puede usar para imprimir una lista de las variables de entorno actuales. Y hasta donde yo entiendo, RANDOMtambién es una variable de entorno.
Entonces, ¿por qué, cuando inicio enven Linux, la salida no incluye RANDOM?
shell
environment-variables
mcmxciv
fuente
fuente

envno es un comando de shell ya que generalmente no está integrado en el shell.declare -xes el equivalente en un shell incorporado.Respuestas:
RANDOMNo 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 usopdkshen OpenBSDRANDOMse enumeraríasetincluso si no se usaba anteriormente.El resto de esta respuesta se refiere a lo que podría esperarse que suceda si
RANDOMse exporta (es decir, se convierte en una variable de entorno).Exportarlo lo
export RANDOMconvertirí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
pdkshOpenBSD en el ejemplo a continuación y obtengo un nuevo valor aleatorio en cadaawkejecución (pero el mismo valor cada vez dentro de la mismaawkinstancia). Utilizandobash, obtendría exactamente el mismo valor aleatorio en todas las invocaciones deawk.En
bash, el valor exportado deRANDOMpermanecería estático independientemente del uso deRANDOMen el shell (donde cada uso de$RANDOMtodavía daría un nuevo valor).Esto se debe a que cada referencia a la variable de shell
RANDOMenbashhace 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ámicasbashvariables, tales comoLINENO,SECONDS,BASHPIDetc.Para actualizar la variable de entorno
RANDOMenbash, habría que asignarle el valor de la variable de shellRANDOMy 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
basho no (pero una suposición educada sería que no lo hace).fuente
RANDOMIncluso 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
exportintegrada. Elenvcomando 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
setbuiltin también devuelve funciones, por lo que para ver solo las variables, puede usar:Finalmente, la
RANDOMvariable 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
envya 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
OPTINDyOPTERR(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-xse exportan, los que no loxestán. (Algunos tendrán otras banderas comoipara entero orpara solo lectura).En Zsh o ksh93, puede usar
typeset -p, aunque Zsh marca las variables exportadas cambiandotypesetaexporten la salida, en lugar de usar banderas.exportpor 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
$RANDOMo a$SOMEVARtravés de un argumento de línea de comando, y no como una variable de entorno? Necesitaríasexportambos para pasarlos por el entorno.stracesalida 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?$RANDOMexpansió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$RANDOMy pasa el formulario expandido aecho.