Самый переносимый способ есть 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 с официально упакованными версиями каждой оболочки.