Как экспортировать переменную, в которой есть точка. Я получаю «недопустимое имя переменной», когда я пытался:
export my.home=/tmp/someDir
-ksh: my.home=/tmp/someDir: invalid variable name
Даже экранирование метасимволов (.) Не помогло
$ export my\.home=/tmp/someDir
export: my.home=/tmp/someDir: is not an identifier
shell
environment-variables
ksh
user1587504
источник
источник
Ответы:
По крайней мере, для
bash
справочной страницы определяется синтаксис экспорта как:Он также определяет «имя» как:
Следовательно, вы действительно не можете определить переменную, так
my.home
как она не является допустимым идентификатором.Я очень уверен, что ваш ksh имеет очень похожее определение идентификатора и поэтому не допускает такого рода переменных. (Посмотрите его справочную страницу.)
Я также очень уверен, что существует какой-то общий стандарт (POSIX?), Определяющий, что разрешено в качестве идентификатора (и, следовательно, имени переменной).
Если вам действительно нужна переменная такого типа, вы можете использовать что-то вроде
чтобы определить это в любом случае. Но опять же, вы не сможете получить к нему доступ, используя обычный синтаксис оболочки. В этом случае вам, вероятно, понадобится другой язык, такой как perl:
Например
должен напечатать ваш путь.
источник
ANT_OPTS
или ~ / .antrc. Нет необходимости в странных именах переменных среды для самого муравья.В то время как переменные окружения могут иметь любое имя (включая пустую строку), не содержащее знака равенства или нулевого байта, оболочки отображают переменные среды на переменные оболочки, и в большинстве оболочек имена переменных ограничиваются буквенно-цифровыми символами ASCII, и
_
там, где первый символ может ' т быть цифрой (для позиционных параметров и других специальных из них , как , за исключением$*
,$-
,$@
, ..., (которые не отображаются в соответствующих переменных окружения)). Также обратите внимание, что некоторые переменные зарезервированы / специально для / оболочки.Исключения к этому:
rc
Оболочки и ее производные , какes
иakanga
поддерживать любое имя , кроме пустой строки, и те, которые все-цифровые или содержать=
символы (и всегда экспортировать все свои переменные среды, и остерегайтесь специальными переменными , такие как*
,status
,pid
...):Тем не менее, он использует свою собственную кодировку для переменных, чье имя не содержит символов alnums или для массивов при передаче в среде выполняемых команд:
AT & T
ksh
,yash
аzsh
также (bash
но только для однобайтовых символов) поддерживают текущую локалию, а не только ASCII.В этих оболочках вы можете изменить локаль, чтобы большинство символов считалось альфа-каналом, но все же это не сработало бы для символов ASCII, таких как
.
. Вы можете обманутьzsh
илиksh
думать,£
что это буква, но не тот.
или любой другой символ ASCII (если речь идет о разрешении символов в именах переменных, например, не о[[:alpha:]]
глобусе).ksh93
имеет специальные переменные, имя которых содержит точку, похожую на точку${.sh.version}
, но они не отображаются на переменные окружения и являются специальными. Необходимо.
убедиться, что он не конфликтует с другими переменными. Если бы он решил вызвать его$sh_version
, он мог бы иметь потенциально сломанные сценарии, которые уже использовали эту переменную (см., Например, как возникаютzsh
проблемы с его$path
или$commands
специальными переменными array / hash (a la csh), которые нарушают некоторые сценарии).Следует отметить , что в дополнение к оболочках , не поддерживающих эти переменные, некоторые оболочки , как pdksh / МКШ сделать удалить их из окружающей среды , которую они получают (
bash
удаляет один с пустым именем,ash
,ksh
иbash
удалить эти строки окружения , которые не содержат=
символов):Подводя итог, лучше всего придерживаться имен переменных , поддерживаемых большинством оболочек и даже пытаются использовать верхний регистр для переменных окружения (и нижний регистр или смешанный регистр для не экспортируемых переменных оболочки) избегать тех , которые являются особенными в оболочках (например
IFS
,PS1
,BASH_VERSION
...).Если вам нужно установить такую переменную в оболочке, которая не поддерживает их, но не отбрасывает их, вы можете либо выполнить себя заново, например:
(очевидно, если вам нужно сделать это в середине скрипта, это не поможет, но вы могли бы тогда взглянуть на этот подход, чтобы сохранить и восстановить среду выполнения оболочки через повторное выполнение). Или попробуйте подход отладчика:
(что один , кажется, работает с
zsh
,yash
,csh
иtcsh
на Linux amd64, но не с какой - либо из других оболочек я попробовал (mksh
,ksh93
,bash
,dash
)).источник
mksh
(иpdksh
) действительно конструировать процессы среды, которые они порождают, получают с нуля, используя только те параметры, которые экспортируются в текущую среду выполнения оболочки, поэтому невозможно передать эти переменные через эти оболочки. (Обратите внимание, что передаваемые переменные могут быть изменены; например, я планирую поддерживать экспорт массивов в течениеmksh
Как отмечают другие посты, самые распространенные оболочки не позволяют устанавливать переменные среды с точками в имени. Однако я обнаружил ситуации, особенно связанные с Docker и вызываемыми программами, когда программное обеспечение требовало значения ключей с точками.
Однако в каждой из этих ситуаций эти пары ключ-значение могут быть переданы в программу другими способами, а не только переменными среды. Например, в Ant вы можете использовать «-propertyfile (filename)» для передачи отформатированной в файл свойств коллекции ключей-значений. Confd позволяет использовать «-backend file -file (yaml file)».
Я передал переменные окружения в форме "C__any_value = 'my.property.key = the value'". Затем я переключил вызов программы, чтобы сначала сгенерировать файл:
Команда
set
в Borne Shell выведет каждое свойство в отдельной строке в формеКоманда
awk
будет обрабатывать только переменные среды, начиная сC__
, а затем извлекать значения, содержащиеся в одинарных кавычках.Этот метод требует, чтобы значение переменной среды было установлено в точном виде, который требуется программе обработки. Кроме того, если значение или ключ вашего свойства будут содержать одинарные кавычки, вам потребуется изменить символ разделителя полей awk на что-то, что, как вы знаете, не будет отображаться, и окружить значение этим символом. Например, чтобы использовать
%
в качестве разделителя:(Точный вывод будет зависеть от вашей оболочки.) Вам нужно будет предпринять дополнительные шаги для декодирования экранирующей кавычки.
источник