В семействе оболочек Bourne все переменные оболочки имеют имена в верхнем регистре; Это означает, что вы не можете определить, является ли конкретная переменная переменной среды или нет, просто взглянув на ее имя. Как определить, какие переменные оболочки Bourne являются локальными (определены только в текущей оболочке)?
13
Ответы:
Если вы хотите увидеть, экспортируется ли переменная или нет, используйте
declare
:источник
Самый переносимый способ есть
export -p
.export -p
списки экспортируемых переменных. Обычно это такdeclare -x
, если ваша оболочка имеетdeclare
.Оболочки в стиле Борна, используемые в настоящее время, должны поддерживать
export -p
, как того требует POSIX :Далее в стандарте поясняется, что значение переменной отображается таким образом, что обычно позволяет использовать его позже в правой части
=
присвоения. Это означает, что это может быть указано. Разные оболочки могут отображать их по-разному, но с одинаковым эффектом.export -p
работает даже в оболочках, которые не имеютdeclare
встроенных функций, таких как Dash .Я передал вывод
grep
для компактности, но если вы не отфильтруете его, вы получите полный список ваших экспортируемых переменных. По твоему вопросу это звучит так, как будто это то, что ты можешь найти наиболее полезным.Некоторые оболочки, такие как Bash, используют нестандартный формат, если явно не указано, что они должны вести себя POSIX-совместимым образом. В Bash
export -p
выдает тот же вывод, что иdeclare -x
по умолчанию.Zsh показывает нестандартный формат, даже когда включена совместимость с POSIX:
В любом случае вы можете извлечь переносимые представления (которые могут быть заключены в кавычки), выполнив поиск слова, за которым следует
=
. Это не зависит от предыдущих слов в строке, если они не предшествуют сразу=
, что не должно. Например:Обратите внимание, что не все записи обязательно есть
=
. Это потому, что переменные могут быть не установлены, но экспортированы. Эти записи отфильтрованы с помощью приведеннойgrep
выше команды, которая может быть или не быть тем, что вы хотите.Большая часть времени, вы просто хотите , чтобы проверить производительность и поэтому вы не будете заботиться , если запись предшествуют
export
,declare -x
,typeset -x
или что - то другое. Тогда просто бегиexport -p
.Я тестировал эти команды в Ubuntu 16.04 LTS с официально упакованными версиями каждой оболочки.
источник
Переменные, которые НЕ экспортируются, можно увидеть из вывода
declare
команды в bash.Переменные, которые экспортируются, можно увидеть в выводе команды
declare -x
илиexport
в bash.источник