Какие символы разрешены в именах переменных среды Linux? Мой беглый поиск на страницах руководства и в Интернете дал только информацию о том, как работать с переменными, но не о том, какие имена разрешены.
У меня есть программа Java, для которой требуется определенная переменная среды, содержащая точку, например com.example.fancyproperty
. В Windows я могу установить эту переменную, но мне не удалось установить ее в Linux (пробовал в SuSE и Ubuntu). Это имя переменной вообще разрешено?
linux
syntax
environment-variables
Кристиан Семрау
источник
источник
-D
командной строки), так что теперь она работает. Очевидно, программа просматривает оба набора переменных, не сообщая мне об этом. Но все же мне любопытно, какие имена переменных среды разрешены.com_example_fancyproperty
иCOM_EXAMPLE_FANCYPROPERTY
.Ответы:
От открытой группы :
Таким образом, имена могут содержать любой символ, кроме = и NUL, но:
Таким образом, хотя имена могут быть действительными, ваша оболочка может не поддерживать ничего, кроме букв, цифр и подчеркиваний.
источник
[a-zA-Z_][a-zA-Z0-9_]*
(неявно предполагая, что эта форма более разумна), но фактическая спецификация (цитата 1) требует, чтобы вся реализация поддерживала что-либо, кроме=
иNUL
?Стандарты POSIX в разделе оболочек IEEE Std 1003.1-2008 / IEEE POSIX P1003.2 / ISO 9945.2 Стандарт Shell и Tools не определяет лексическое соглашение для имен переменных, однако беглый взгляд на источник показывает, что он использует что-то похожее на
[a-zA-Z_]+[a-zA-Z0-9_]*
(Изменить: добавлено недостающее подчеркивание во втором классе символов.)
Небольшое примечание, поскольку некоторые оболочки не поддерживают + в регулярном выражении, потенциально более переносимым регулярным выражением может быть:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
источник
[a-zA-Z_][a-zA-Z0-9_]*
Для тех, кто, как я, находит ссылку на bash-4.1 немного расплывчатой (616 000 строк кода), вот несколько советов по найдите соответствующие строки кода:subst.c: param_expand(), in the default case
->general.h:
/ * Точно определите, из чего состоит допустимый идентификатор оболочки. * / #define legal_variable_starter (c) (ISALPHA (c) || (c == ' ')) #define legal_variable_char (c) (ISALNUM (c) || c == ' ')a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit
.Мое быстрое тестирование показало, что они в основном следуют тем же правилам, что и имена переменных C, а именно:
_
и 0–9Так что это исключает
.
внутри них. Присваивается любое недопустимое имя переменнойunknown command
.Это было протестировано в ZSH, который в основном совместим с BASH.
источник
Зависит от того, что вы подразумеваете под словом «разрешено».
Игнорирование Windows на время:
Окружение - это массив строк, переданный основной функции программы. Если вы прочитаете execve (2), вы не увидите никаких требований или ограничений для этих строк, кроме нулевого завершения.
По соглашению каждая строка состоит из NAME = value. Соглашения о кавычках не существует, поэтому вы не можете использовать знак «=» в имени в этом соглашении.
Нормальные люди задают эти условия, обсуждая их со своей оболочкой. У каждой оболочки есть свои представления о том, какие имена переменных являются допустимыми, поэтому вам нужно прочитать страницу руководства для текущей оболочки, чтобы узнать, что она думает.
Как правило, такие вещи, как com.baseball.spit = fleagh, являются свойствами системы Java, и независимо от того, готова ли какая-либо программа Java вернуться к среде, лучше указать их с помощью -D.
источник
Это зависит от оболочки. Я предполагаю, что вы используете bash по умолчанию, и в этом случае буквы, цифры и символы подчеркивания разрешены, но вы не можете начинать имя переменной с числа. Начиная с Bash v.3, точки не допускаются в именах переменных .
источник
ДА, ТЫ МОЖЕШЬ СДЕЛАТЬ ЭТО.
Используйте
exec
иenv
command для реализации этой сцены.Тестовое приспособление в Docker
Запустить команду в контейнере:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Проверьте переменные среды:
Используйте
ps aux
для проверки того, что PID не измененИспользуйте
python
для проверки переменной environemntapk add python python -c 'import os; print(os.environ["spring.application_name"])'
ВЫХОД есть
happy-variable-name
.Что случилось?
По-другому
Если вы используете докер, вы можете установить переменную в Dockerfile
Если вы используете кубернеты, вы можете установить переменную с помощью ConfigMap
test.yaml
Развернуть модуль
kubectl apply -f test.yaml
Проверить
kubectl logs foobar
вывод:ConfigMap разрешает '-', '_' или '.'
источник
Хотя большая часть оболочки не позволяет устанавливать переменные среды (как упоминалось в других ответах), при необходимости вы можете выполнять другие программы с нестандартными переменными среды, используя
env(1)
.Например, стирание всего окружения и установка
Strange.Env:Var
значенияfoo
и выполнение программы perl, которая печатает это:напечатает
источник