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

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

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

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

Ответ 3

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

  • a-z, A-Z, _ и 0-9
  • Не начинайте с номера

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

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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