RANDOM
nie jest zmienną środowiskową. Jest to zmienna powłoki obsługiwana przez niektóre powłoki. Zwykle nie jest eksportowany domyślnie. Dlatego nie pojawia się na wyjściu env
.
Raz to było wykorzystywane co najmniej raz, by pokazać się na wyjściu set
, który sam w sobie, listy zmienne powłoki (i funkcje) i ich wartości w bieżącej sesji powłoki. To zachowanie zależy od powłoki i użycia pdksh
na OpenBSD, RANDOM
byłoby wymienione na liście, set
nawet jeśli nie było wcześniej używane.
Pozostała część odpowiedzi dotyczy tego, czego można się było spodziewać, gdyby RANDOM
został wyeksportowany (tj. Przekształcony w zmienną środowiskową).
Wyeksportowanie go export RANDOM
spowoduje, że będzie zmienną środowiskową, ale jego użycie byłoby poważnie ograniczone, ponieważ jego wartość w procesie potomnym byłaby „losowa, ale statyczna” (co oznacza, że byłaby niezmienną liczbą losową). Dokładne zachowanie różni się w zależności od powłoki.
Korzystam pdksh
z OpenBSD w poniższym przykładzie i otrzymuję nową losową wartość przy każdym awk
uruchomieniu (ale tę samą wartość za każdym razem w tej samej awk
instancji). Używając bash
, uzyskałbym dokładnie tę samą losową wartość we wszystkich wywołaniach awk
.
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
25444 25444
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
30906 30906
W bash
, wyeksportowana wartość RANDOM
pozostałaby statyczna bez względu na użycie RANDOM
w powłoce (gdzie każde użycie $RANDOM
wciąż dawałoby nową wartość).
To dlatego, że każde odwołanie do zmiennej powłoki RANDOM
w bash
sprawia, że dostęp do powłoki jej wewnętrzna get_random()
funkcja dać zmiennej nową wartość losową, ale powłoka nie aktualizuje zmienną środowiskową RANDOM
. Jest to podobne do zachowania jak w przypadku innych dynamicznych bash
zmiennych, takich jak LINENO
, SECONDS
, BASHPID
itp
Aby zaktualizować zmienną środowiskową RANDOM
w bash
, trzeba by przypisać mu wartość zmiennej powłoki RANDOM
i reeksportu go:
export RANDOM="$RANDOM"
Nie jest dla mnie jasne, czy miałoby to dodatkowy efekt uboczny ponownego uruchomienia generatora liczb losowych, bash
czy też nie (ale zgadywano by, że tak nie jest).
env
nie jest poleceniem powłoki, ponieważ zwykle nie jest wbudowane w powłokę.