Знак доллара в значении переменной среды
Является ли плохой практикой иметь знак доллара в значении переменной среды?
например:
MY_VAR="$toto"
Чтобы быть более точным, я хотел бы установить его в /etc/environment
файл должен быть доступен с помощью Java-программы. Я сделал тест, и он работает, но я просто хочу убедиться, что я не столкнусь с каким-либо катастрофическим побочным эффектом. Значение переменной является паролем и начинается со знака доллара, поэтому у меня нет выбора.
4 ответа
Для конкретного случая /etc/environment
нет $
в значении переменной ничего особенного не значит. /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
У manpage есть примеры:
Silly examples of escaped variables, just to show how they work.
DOLLAR DEFAULT=\$
DOLLARDOLLAR DEFAULT= OVERRIDE=\$${DOLLAR}
DOLLARPLUS DEFAULT=\${REMOTEHOST}${REMOTEHOST}
ATSIGN DEFAULT="" OVERRIDE=\@
Ваш пример не иллюстрирует ваш вопрос.
$ toto="somevalue"
$ MY_VAR="$toto"
$ echo $MY_VAR
somevalue
$
Чтобы сделать то, что вы просили, вам нужно:
MY_VAR='$toto'
или же
MY_VAR="\$toto"
Не могу сказать наверняка, если это плохая практика. Лично я не вижу очевидной проблемы.
Многие отметили, что 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
часто плохая практика, по этой самой причине).
Поэтому нет, иметь знак доллара в переменной shell / environment - это не плохая практика, по крайней мере, не более, чем любой другой специальный символ оболочки.
Чтобы ответить на ваш точный вопрос:
Да, плохо иметь знак доллара в значении переменной среды. Однако это не то, что делает фрагмент кода, который вы отображаете.
MY_VAR="$toto"
$
это специальный символ для вашей оболочки (будь то bash
или же dash
), и если вы не защищены от расширения переменных, на самом деле вы не будете ставить буквальный знак доллара в значение MY_VAR
,
Для этого вам нужно будет избежать $
либо с обратной косой чертой перед ней, либо с одинарными кавычками.