RANDOM
не є змінною середовища. Це змінна оболонка, яка підтримується деякими оболонками. Зазвичай не експортується за замовчуванням. Ось чому це не відображається у результатах env
.
Після того, як він був використаний принаймні один раз, він буде відображатися у висновку set
, що, сам по собі, перераховує змінні оболонки (і функція) і їх значення в поточній сесії оболонки. Така поведінка залежить від оболонки та використання pdksh
в OpenBSD, RANDOM
перераховується, set
навіть якщо раніше не використовувалося.
Решта цієї відповіді стосується того, що можна було б очікувати, якщо відбудеться RANDOM
експорт (тобто перетворений на змінну середовища).
Експорт з ним export RANDOM
зробив би його змінною середовища, але його використання було б сильно обмеженим, оскільки його значення в дочірньому процесі було б "випадковим, але статичним" (це означає, що це буде незмінне випадкове число). Точна поведінка відрізняється між оболонками.
Я використовую pdksh
OpenBSD у наведеному нижче прикладі, і я отримую нове випадкове значення в кожному awk
запуску (але одне і те ж значення кожного разу в межах одного і того ж awk
екземпляра). Використовуючи bash
, я отримав би абсолютно однакове випадкове значення у всіх викликах awk
.
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
25444 25444
$ awk 'BEGIN { print ENVIRON["RANDOM"], ENVIRON["RANDOM"] }'
30906 30906
У bash
, експортне значення RANDOM
залишатиметься статичним незалежно від використання RANDOM
в оболонці (де кожне використання $RANDOM
все ще дасть нове значення).
Це пояснюється тим, що кожна посилання на змінну оболонки RANDOM
у bash
змушує оболонку отримувати доступ до її внутрішньої get_random()
функції, щоб надати змінній нове випадкове значення, але оболонка не оновлює змінну середовища RANDOM
. Це схоже на поведінку , як і інших динамічних bash
змінних, таких , як LINENO
, SECONDS
, і BASHPID
т.д.
Щоб оновити змінну середовища RANDOM
в bash
, вам доведеться призначити їй значення змінної оболонки RANDOM
та повторно експортувати її:
export RANDOM="$RANDOM"
Мені незрозуміло, чи це призвело б до додаткового побічного ефекту від повторного висівання генератора випадкових чисел у bash
чи ні (але добре зрозуміла здогадка - це не так).
env
не є командою оболонки, оскільки вона зазвичай не вбудована в оболонку.