Является ли плохой практикой использование знака доллара в значении переменной среды?
ex:
MY_VAR="$toto"
Чтобы быть более точным, я хотел бы установить его в /etc/environment
файл для доступа к Java-программе. Я сделал тест, и он работает, но я просто хочу убедиться, что я не столкнусь с каким-либо катастрофическим побочным эффектом. Значение переменной является паролем и начинается со знака доллара, поэтому у меня нет выбора.
Для конкретного случая /etc/environment
, нет, a $
в значении переменной не означает ничего специального. /etc/environment
файл, считанный названным модулем PAM pam_env
, и pam_env
имеет определенный синтаксис для интерпретации $
:
/etc/environment
, это оставляют неинтерпретируемым.В /etc/security/pam_env.conf
и ~/.pam_environment
(определенный для пользователя файл), pam_env
обработки $
особенно, когда это видит строки со следующим синтаксисом:
FOO DEFAULT=SOMETHING${BAR}SOMETHINGELSE$BAR
FOO OVERRIDE=SOMETHING${BAR}SOMETHINGELSE$BAR
В этом случае, ${BAR}
заменяется значением переменной BAR
, но нет $BAR
.
В обоих случаях, для строки как:
FOO=BAR$BAR${BAR}
Содержание переменной FOO
будет литеральная строка BAR$BAR${BAR}
.
pam_env.conf
страница справочника имеет примеры:
Silly examples of escaped variables, just to show how they work.
DOLLAR DEFAULT=\$
DOLLARDOLLAR DEFAULT= OVERRIDE=\$${DOLLAR}
DOLLARPLUS DEFAULT=\${REMOTEHOST}${REMOTEHOST}
ATSIGN DEFAULT="" OVERRIDE=\@
Многие указали, что MY_VAR="$toto"
присвоит MY_VAR
текущее значение $toto
или пустая строка в случае, если $toto
сброшен (или в случае, если $toto
сама содержит пустую строку, очевидно), но я удивлен, что никто еще не указал, что MY_VAR="$toto"
будет не , устанавливает переменную среды, а скорее переменную оболочки (если переменная, названная MY_VAR
, уже не присутствует в среде, возможно, потому что это является только тангенциальным к фактическому вопросу).
Однако главный не, это не плохая практика, или это - так же плохая практика как имеющий любой другой специальный символ оболочки в переменной, которая часто не преодолима.
В 99% случаев оболочка развернет переменную в текущей оболочке только однажды (или не развернет его вообще, например, при включении в одинарные кавычки):
$ MY_VAR='$toto'
$ echo $MY_VAR
$toto
$ echo '$MY_VAR'
$MY_VAR
$ echo "$MY_VAR"
$toto
$ echo $(echo $MY_VAR)
$toto
1% случая того, чтобы быть, например, когда на переменную ссылаются в eval
выражение, которое добавляет уровень абстракции:
$ MY_VAR='$toto'
$ eval echo $MY_VAR
$
, Но это - очевидно, ожидаемый результат, и снова, затем имение любого другого специального символа оболочки в переменной нужно считать плохой практикой таким же образом:
$ MY_VAR='&&'
$ eval echo $MY_VAR
bash: syntax error: unexpected end of file
(истина, являющаяся тем , использование eval
часто является плохой практикой по этой самой причине).
Так не, имея знак доллара в оболочке / переменная среды не является плохой практикой, по крайней мере, не больше, чем наличие никакого другого специального символа оболочки.
DISPLAY
переменная среды, если Вы хотите использовать Zenity от rc.*
сценарий.
– David Foerster
19 August 2017 в 00:56
Ваш пример не иллюстрирует Ваш вопрос.
$ toto="somevalue"
$ MY_VAR="$toto"
$ echo $MY_VAR
somevalue
$
, Чтобы сделать, что Вы спросили, Вам будет нужно:
MY_VAR='$toto'
или
MY_VAR="\$toto"
не Может сказать наверняка, если это - плохая практика. Лично я не вижу очевидной проблемы.
Отвечать на Ваш точный вопрос:
Да, это - плохая практика, чтобы иметь знак доллара в значении переменной среды. Однако это не то, что на самом деле, делает фрагмент кода, который Вы отобразили.
MY_VAR="$toto"
$
специальный символ к Вашей оболочке (или bash
или dash
), и, если не защищено от переменного расширения, Вы не будете на самом деле помещать литеральный знак доллара в значение MY_VAR
.
, Чтобы сделать это необходимо было бы выйти эти $
, или с обратной косой чертой незадолго до него или с одинарными кавычками вокруг него.