RANDOM
non è una variabile d'ambiente. È una variabile di shell gestita da alcune shell. In genere non viene esportato per impostazione predefinita. Questo è il motivo per cui non viene visualizzato nell'output di env
.
Una volta usato almeno una volta, verrebbe visualizzato nell'output di set
, che, da solo, elenca le variabili (e le funzioni) della shell e i loro valori nella sessione della shell corrente. Questo comportamento dipende dalla shell e l'utilizzo pdksh
su OpenBSD, RANDOM
sarebbe elencato set
anche se non utilizzato in precedenza.
Il resto di questa risposta riguarda ciò che ci si potrebbe aspettare se RANDOM
fosse esportato (cioè trasformato in una variabile d'ambiente).
Esportarlo con export RANDOM
lo renderebbe una variabile d'ambiente ma il suo uso sarebbe fortemente limitato in quanto il suo valore in un processo figlio sarebbe "casuale ma statico" (nel senso che sarebbe un numero casuale immutabile). Il comportamento esatto differisce tra le shell.
Sto usando pdksh
OpenBSD nell'esempio seguente e ottengo un nuovo valore casuale in ogni awk
corsa (ma lo stesso valore ogni volta nella stessa awk
istanza). Usando bash
, otterrei esattamente lo stesso valore casuale in tutte le invocazioni di awk
.
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
25444 25444
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
30906 30906
In bash
, il valore esportato di RANDOM
rimarrebbe statico indipendentemente dall'uso RANDOM
nella shell (dove ogni uso di $RANDOM
darebbe comunque un nuovo valore).
Questo perché ogni riferimento alla variabile shell RANDOM
in bash
fa sì che la shell acceda alla sua get_random()
funzione interna per dare alla variabile un nuovo valore casuale, ma la shell non aggiorna la variabile d'ambiente RANDOM
. Questo è un comportamento simile come con altri dinamiche bash
variabili, come LINENO
, SECONDS
, BASHPID
etc.
Per aggiornare la variabile d'ambiente RANDOM
in bash
, si dovrà assegnare il valore della variabile di shell RANDOM
e riesportazione esso:
export RANDOM="$RANDOM"
Non mi è chiaro se questo avrebbe l'effetto collaterale aggiuntivo di ripetere il seeding del generatore di numeri casuali bash
o meno (ma un'ipotesi istruita sarebbe che non lo faccia).
env
non è un comando shell poiché di solito non è incorporato nella shell.