Из Открытая группа :
Эти строки имеют форму имя = значение; имена не должны содержать символа '='. Для значений, которые должны быть переносимы между системами, соответствующими IEEE Std 1003.1-2001, значение должно состоять из символов из переносимого набора символов ( кроме NUL и как указано ниже ).
Таким образом, имена могут содержать любой символ, кроме = и NUL, но:
Имена переменных среды, используемые утилитами в оболочке и томе утилит IEEE Std 1003.1-2001, состоят исключительно из заглавных букв, цифр и символа '_' (подчеркивание) из символов , определенных в переносимом наборе символов , и не начинаются с цифры . Другие символы могут быть разрешены реализацией ; приложения должны допускать присутствие таких имен.
Таким образом, хотя имена могут быть допустимыми, ваша оболочка может не поддерживать ничего, кроме букв, цифр и подчеркиваний.
ДА, МОЖНО СДЕЛАТЬ ЭТО.
Использование exec
и env
команда для реализации этой сцены.
docker run -it --rm alpine:3.10
Команда выполнения в контейнере:
exec env spring.application_name=happy-variable-name ${SHELL:-/bin/sh}
Проверяют переменные среды:
HOSTNAME=bd0bccfdc53b
SHLVL=2
HOME=/root
spring.application_name=happy-variable-name
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
Использование ps aux
для проверки PID, не измененного
PID USER TIME COMMAND
1 root 0:00 /bin/sh
12 root 0:00 ps aux
Использование python
для проверки environemnt переменной
apk add python
python -c 'import os; print(os.environ["spring.application_name"])'
, ВЫВОД happy-variable-name
.
при использовании докера можно установить переменную в Dockerfile
FROM busybox
ENV xx.f%^&*()$#ff=1234
при использовании kubernetes можно установить переменную ConfigMap
test.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: foo-config
data:
"xx.ff-bar": "1234"
---
apiVersion: v1
kind: Pod
metadata:
name: foobar
spec:
containers:
- name: test-container
image: k8s.gcr.io/busybox
command: [ "/bin/sh", "-c", "env" ]
envFrom:
- configMapRef:
name: foo-config
restartPolicy: Never
, Развертываются, переходная приставка kubectl apply -f test.yaml
Проверяют kubectl logs foobar
вывод:
xx.ff-bar=1234
ConfigMap позволяют '-', '_' или'. '
В то время как большая часть оболочки не позволит устанавливать переменные среды (как упомянуто в других ответах), если у Вас будет потребность, можно выполнить другие программы с нестандартными переменными среды с помощью env(1)
.
, Например, стирая всю среду и установку Strange.Env:Var
для оценки foo
, и выполняя программу жемчуга, которая печатает его:
env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'
распечатает
$VAR1 = {
'Strange.Env:Var' => 'foo'
};
Это зависит от оболочки. Я предполагаю, что вы используете bash по умолчанию, и в этом случае буквы, цифры и символы подчеркивания разрешены, но вы не можете начинать имя переменной с числа. Начиная с Bash v.3, периоды не допускаются в именах переменных .
Зависит от того, что вы подразумеваете под словом «разрешено».
Игнорирование Windows из-за одноразового номера:
Среда - это массив строк, переданный основной функции программы. Если вы прочитаете execve (2), вы не увидите никаких требований или ограничений для этих строк, кроме нулевого завершения.
По соглашению каждая строка состоит из NAME = value. Соглашения о кавычках не существует, поэтому вы не можете использовать знак «=» в имени в этом соглашении.
Нормальные люди задают эти условия, обсуждая их со своей оболочкой. У каждой оболочки есть свои представления о том, какие имена являются допустимыми переменными, поэтому вам нужно прочитать страницу руководства для текущей оболочки, чтобы узнать, что она думает.
Обычно такие вещи, как com.baseball.spit = fleagh, являются системными свойствами Java, и независимо от того, готова ли какая-либо программа Java вернуться к среде, лучше указать их с помощью -D.
Стандарты POSIX на раздел "Оболочки IEEE Std 1003.1-2008 / IEEE POSIX P1003.2/ISO 9945.2 Стандарта Shell and Tools не определяет лексическую конвенцию для имен переменных, однако беглый взгляд на источник показывает, что в нем используется нечто подобное
[a-zA-Z_]+[a-zA-Z0-9_]*
(Edit: Added missing underscore in 2nd character class.)
Небольшое замечание, поскольку некоторые оболочки не поддерживают + в regex, потенциально более переносимым regex может быть:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
Мое быстрое тестирование показало, что они в основном следуют тем же правилам, что и имена переменных C, а именно
_
и 0-9 Таким образом, это исключает .
внутри них. Любому недопустимому имени переменной присваивается unknown command
.
Это было протестировано в ZSH, который в основном совместим с BASH.