Знак доллара в значении переменной среды

Является ли плохой практикой иметь знак доллара в значении переменной среды?

например:

MY_VAR="$toto"

Чтобы быть более точным, я хотел бы установить его в /etc/environment файл должен быть доступен с помощью Java-программы. Я сделал тест, и он работает, но я просто хочу убедиться, что я не столкнусь с каким-либо катастрофическим побочным эффектом. Значение переменной является паролем и начинается со знака доллара, поэтому у меня нет выбора.

4 ответа

Решение

Для конкретного случая /etc/environment нет $ в значении переменной ничего особенного не значит. /etc/environment файл, читаемый модулем PAM с именем pam_env, а также pam_env имеет определенный синтаксис для интерпретации $:

  1. В /etc/environment, это осталось без толкования.
  2. В /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,

Для этого вам нужно будет избежать $либо с обратной косой чертой перед ней, либо с одинарными кавычками.

Другие вопросы по тегам