Як визначити, експортуються чи ні змінні оболонки?


13

З сімейством оболонок Bourne всі змінні оболонки мають великі регістри імен; що означає, що ви не можете визначити, чи є певна змінна змінна середовище чи не просто, дивлячись на її ім'я. Як визначити, які змінні оболонки Bourne є локальними (визначаються лише в межах поточної оболонки)?


4
Оболонка Борна або оболонка Борна? Чи можете ви вказати на посилання на велику змінну?
Jeff Schaller

У оболонці Bourne again, оскільки всі змінні є великими літерами, як можна визначити, які змінні bash є локальними?
Shoulderpadz

7
@Shoulderpadz ніщо не заважає вам створювати невеликі змінні.
муру

1
Під локальними ви маєте на увазі змінні, які не були експортовані?
Елія Каган

4
Відмінність, про яку ви запитуєте, - це змінні оболонки проти змінних середовища, а не глобальні та локальні. Зауважте, що є змінні оболонки, які не є змінними середовища (тобто те, що ви називаєте "локальним"), і є змінні середовища, які не є змінними оболонок (середовище може містити імена, які не є дійсними ідентифікаторами оболонок, і таким чином не може бути змінним).
чепнер

Відповіді:


17

Якщо ви хочете перевірити, експортується чи ні змінна, використовуйте declare:

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

26

Найбільш портативний спосіб export -p.

export -pсписки експортованих змінних. Зазвичай це подобається declare -x, якщо ваша оболонка є declare.

Раковини в стилі Борна, які зараз використовуються, повинні підтримувати export -p, як це вимагає POSIX :

Коли -p задано, експорт записує на стандартний вихід імена та значення всіх експортованих змінних у такому форматі:

"export %s=%s\n", <name>, <value>

якщо ім'я встановлено, і:

"export %s\n", <name>

якщо ім’я не встановлено

Стандарт продовжує пояснювати, що значення змінної відображається таким чином, що зазвичай дозволяє використовувати її пізніше праворуч =у призначенні. Це означає, що це може бути цитувано. Різні оболонки можуть відображати їх по-різному, але з однаковим ефектом. export -pпрацює навіть в оболонках, які не мають declareвбудованого, як Dash .

$ dash -c 'export -p | grep HOME='  # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME='  # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek

Я переклав вихід на grepкомпактність, але якщо ви не фільтруєте його, ви отримуєте повний список експортованих змінних. З вашого запитання звучить так, що саме вам може бути корисним.

Деякі оболонки, як, наприклад, Bash, використовують нестандартний формат, якщо явно не доручено поводитись на POSIX-сумісний спосіб. У Bash export -pвидається такий же вихід, що і declare -xза замовчуванням.

$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME='  # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"

Zsh показує нестандартний формат, навіть коли сумісність POSIX включена:

$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek

У будь-якому випадку, ви можете витягнути портативні подання (які можуть бути цитовані), шукаючи слово, за яким слід =. Це не покладається на попередні слова в рядку, доки вони не одразу передують =, чого не повинні. Наприклад:

% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....

Зауважте, що не всі записи обов'язково є =. Це тому, що змінні можуть бути зняті, але експортовані. Ці записи відфільтровані grepкомандою вище, яка може бути, а може бути і не такою, яку ви хочете.

Велика частина часу, ви просто хочете , щоб перевірити продуктивність і тому ви не будете піклуватися , якщо запис передують export, declare -x, typeset -xабо що - то інше. Тоді просто біжи export -p.

Я протестував ці команди на Ubuntu 16.04 LTS з офіційно упакованими версіями кожної оболонки.


0

Змінні, які НЕ експортуються, можна побачити з виводу declareкоманди в bash.

Змінні, які експортуються, можна побачити з виводу команди declare -xабо exportкоманди в bash.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.