Допустимые символы в именах переменных среды Linux

130
задан codeforester 23 October 2018 в 20:40
поделиться

7 ответов

Из Открытая группа :

Эти строки имеют форму имя = значение; имена не должны содержать символа '='. Для значений, которые должны быть переносимы между системами, соответствующими IEEE Std 1003.1-2001, значение должно состоять из символов из переносимого набора символов ( кроме NUL и как указано ниже ).

Таким образом, имена могут содержать любой символ, кроме = и NUL, но:

Имена переменных среды, используемые утилитами в оболочке и томе утилит IEEE Std 1003.1-2001, состоят исключительно из заглавных букв, цифр и символа '_' (подчеркивание) из символов , определенных в переносимом наборе символов , и не начинаются с цифры . Другие символы могут быть разрешены реализацией ; приложения должны допускать присутствие таких имен.

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

193
ответ дан 24 November 2019 в 00:02
поделиться

ДА, МОЖНО СДЕЛАТЬ ЭТО.

Использование 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.

, Что происходит?

  1. вызов Shell встроенное должностное лицо
  2. Shell встроенный исполнительный вызов syscall.exec создает процесс 'ENV' для замены текущей оболочки
  3. , огибающий процесс звонит, syscall.execvp создают процесс '/bin/sh' для замены огибающего процесса

Иначе

  • изображение Докера

при использовании докера можно установить переменную в Dockerfile

FROM busybox
ENV xx.f%^&*()$#ff=1234
  • Kubernetes configmap

при использовании 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 позволяют '-', '_' или'. '

0
ответ дан 24 November 2019 в 00:02
поделиться

В то время как большая часть оболочки не позволит устанавливать переменные среды (как упомянуто в других ответах), если у Вас будет потребность, можно выполнить другие программы с нестандартными переменными среды с помощью env(1).

, Например, стирая всю среду и установку Strange.Env:Var для оценки foo, и выполняя программу жемчуга, которая печатает его:

env -i Strange.Env:Var=foo perl -MData::Dumper -E 'say Dumper(\%ENV)'

распечатает

$VAR1 = {
          'Strange.Env:Var' => 'foo'
        };
0
ответ дан 24 November 2019 в 00:02
поделиться

Это зависит от оболочки. Я предполагаю, что вы используете bash по умолчанию, и в этом случае буквы, цифры и символы подчеркивания разрешены, но вы не можете начинать имя переменной с числа. Начиная с Bash v.3, периоды не допускаются в именах переменных .

5
ответ дан 24 November 2019 в 00:02
поделиться

Зависит от того, что вы подразумеваете под словом «разрешено».

Игнорирование Windows из-за одноразового номера:

Среда - это массив строк, переданный основной функции программы. Если вы прочитаете execve (2), вы не увидите никаких требований или ограничений для этих строк, кроме нулевого завершения.

По соглашению каждая строка состоит из NAME = value. Соглашения о кавычках не существует, поэтому вы не можете использовать знак «=» в имени в этом соглашении.

Нормальные люди задают эти условия, обсуждая их со своей оболочкой. У каждой оболочки есть свои представления о том, какие имена являются допустимыми переменными, поэтому вам нужно прочитать страницу руководства для текущей оболочки, чтобы узнать, что она думает.

Обычно такие вещи, как com.baseball.spit = fleagh, являются системными свойствами Java, и независимо от того, готова ли какая-либо программа Java вернуться к среде, лучше указать их с помощью -D.

5
ответ дан 24 November 2019 в 00:02
поделиться

Стандарты 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,}

33
ответ дан 24 November 2019 в 00:02
поделиться

Мое быстрое тестирование показало, что они в основном следуют тем же правилам, что и имена переменных C, а именно

  1. az, AZ, _ и 0-9
  2. НЕ МОГУТ начинаться с числа

Таким образом, это исключает . внутри них. Любому недопустимому имени переменной присваивается unknown command .

Это было протестировано в ZSH, который в основном совместим с BASH.

11
ответ дан 24 November 2019 в 00:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: