it-swarm.com.ru

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

Какие символы разрешены в именах переменных среды Linux? Мой беглый поиск по страницам руководства и по сети действительно дал информацию только о том, как работать с переменными, но не о том, какие имена разрешены.

У меня есть программа Java, для которой требуется определенная переменная среды, содержащая точку, например com.example.fancyproperty. В Windows я могу установить эту переменную, но мне не повезло установить ее в Linux (пробовал в SuSE и Ubuntu). Это имя переменной даже разрешено?

125
Christian Semrau

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

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

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

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

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

178
Robert Gamble

Раздел стандартов POSIX для оболочек IEEE Std 1003.1-2008/IEEE POSIX P1003.2/ISO 9945.2 Стандарт Shell and Tools не определяет лексическое соглашение для имен переменных, однако краткий посмотрите на источник показывает, что он использует что-то похожее на

[a-zA-Z_]+[a-zA-Z0-9_]*

(Правка: Добавлено недостающее подчеркивание во втором классе символов.)

Небольшое примечание: поскольку некоторые оболочки не поддерживают + в регулярном выражении, потенциально более переносимое регулярное выражение может быть:

[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}

31
Aiden Bell

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

  1. a-z, A-Z, _ и 0-9
  2. НЕ может начинаться с цифры

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

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

10
LukeN

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

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

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

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

Нормальные люди устанавливают эти строки, обсуждая их со своей оболочкой. У каждой оболочки есть свои представления о том, что является допустимыми переменными NAME, поэтому вам нужно прочитать страницу руководства для Shell-of-of-the-time, чтобы увидеть, что она думает.

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

4
bmargulies

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

2
ire_and_curses