Допустимые символы в именах переменных среды Linux - PullRequest
125 голосов
/ 12 мая 2010

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

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

Ответы [ 5 ]

179 голосов
/ 12 мая 2010

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

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

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

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

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

32 голосов
/ 12 мая 2010

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

10 голосов
/ 12 мая 2010

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

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

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

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

4 голосов
/ 12 мая 2010

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

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

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

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

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

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

2 голосов
/ 12 мая 2010

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

...