Как экспортировать переменные, которые установлены, все сразу?

39

setКоманда отображает все локальные переменные, как показано ниже. Как мне экспортировать все эти переменные одновременно?

>set
a=123
b="asd asd"
c="hello world"
Neerav
источник
что значит экспорт сразу? Вы можете использовать точки с запятой для определения в одной строке ... как a = 123; b = "asd asd"; c = "hello world"
Raza
Очень похоже на unix.stackexchange.com/q/79064/4667
Гленн Джекман
2
setтакже отображает функции и системные переменные, такие как BASH_VERSION
Гленн Джекман
Ваш вопрос неясен. Это отрывок из setвывода, который вы показываете? Если так, то это не так bash. Вы хотите экспортировать все установленные в данный момент переменные, включая специальные переменные оболочки? Или только те 3 переменные, как в export a b c?
Стефан Шазелас
export ${!T*}экспортирует любой определенный параметр, имя которого начинается с T. К сожалению, кажется, нет способа легко сгенерировать список всех определенных параметров.
chepner

Ответы:

72

Выполните следующую команду перед установкой переменных:

set -a 

справочная страница:

-a
Когда эта опция включена, атрибут экспорта должен быть установлен для каждой переменной, которой выполняется присвоение;

Чтобы отключить эту опцию, запустите set +aпотом.

Пример:

set -a
. ./environment
set +a

Где environmentсодержится:

FOO=BAR
BAS='quote when using spaces'
Нитин
источник
13
Это должно быть включено перед назначением переменных, хотя. Он ничего не делает с ранее назначенными переменными.
chepner
1
@chepner, спасибо, я забыл упомянуть об этом !!
Нитин
Это также автоматически экспортирует функции так же, какfunction example(){ echo good; }; export -f example
Оливер I
5
`echo "export" $((set -o posix ; set)|awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}')`
  1. Сначала получите все установленные переменные окружения (set -o posix ; set) : https://superuser.com/questions/420295/how-do-i-see-a-list-of-all-currently-defined-environment-variables-in-a- линукс-ба

  2. Получить все имена переменных среды, разделенные пробелом: awk -F "=" 'BEGIN{ORS=" "}1 $1~/[a-zA-Z_][a-zA-Z0-9_]*/ {print $1}' Ссылка: значение столбца awk-Printing без новой строки и добавление запятой и https://stackoverflow.com/questions/14212993/regular-expression-to-match-a-pattern-inside- AWK-команда

  3. Теперь нам нужно экспортировать эти переменные, но xargs не может этого сделать, потому что он разветвляет дочерний процесс, экспорт должен выполняться под текущим процессом. echo "export" ...создайте команду, которую мы хотим, затем используйте `` для ее запуска. Вот и все: с.

Медведь Хуан
источник
Добро пожаловать в U & L SE. Может быть, вы можете отредактировать свой пост и дать некоторые объяснения.
Архемар
1
Неправильно полагать, что имена переменных среды будут состоять только из аз и аз. Они обычно включают в себя подчеркивания и цифры, так что шаблон будет [a-zA-Z_][a-zA-Z0-9_]*. Существуют некоторые варианты в зависимости от используемой вами оболочки, но это безопасный / переносимый подход.
Крис Джонсон
Хороший вопрос @ChrisJohnson - обновлено!
Уил Мур III
3

Вы можете добавить exportимя переменной через awkи evalк полученному результату:

eval $(printenv | awk -F= '{ print "export " $1 }')
Уил Мур III
источник
2
printenvпечатает переменные, которые уже экспортированы. Это также не будет работать должным образом, если есть переменные, содержащие символы новой строки.
Стефан
2

Это работает, если ваша оболочка bash (возможно, и другие оболочки)

export > /my/env/var/file

Ваш новый файл будет содержать дамп всех определенных на данный момент переменных ... с такими записями, как

declare -x PORT="9000"
declare -x PORT_ADMIN="3001"
declare -x PORT_DOCKER_REGISTRY="5000"
declare -x PORT_ENDUSER="3000"
declare -x PRE_BUILD_DIR="/cryptdata6/var/log/tmp/khufu01/loud_deploy/curr/loud-build/hygge"
declare -x PROJECT_ID="hygge"
declare -x PROJECT_ID_BUSHIDO="bushido"

затем поднять текущую оболочку со всеми этими проблемами env vars

source  /my/env/var/file
Скотт Стенсленд
источник