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

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

ex:

MY_VAR="$toto"

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

3
задан 9 April 2016 в 23:37

4 ответа

Для конкретного случая /etc/environment, нет, a $ в значении переменной не означает ничего специального. /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 страница справочника имеет примеры:

Silly examples of escaped variables, just to show how they work.

         DOLLAR         DEFAULT=\$
         DOLLARDOLLAR   DEFAULT=        OVERRIDE=\$${DOLLAR}
         DOLLARPLUS     DEFAULT=\${REMOTEHOST}${REMOTEHOST}
         ATSIGN         DEFAULT=""      OVERRIDE=\@
3
ответ дан 10 April 2016 в 09:37
  • 1
    @0andriy, enlight меня является там каким-либо исходным доступным пакетом ядра Linux Ubuntu? Вы разработали бы свой вопрос? Вы означаете говорить Ubuntu, ядро Linux отличается, чем основной поток ядро Linux? –  20 August 2017 в 00:38

Многие указали, что 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 часто является плохой практикой по этой самой причине).

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

0
ответ дан 10 April 2016 в 09:37
  • 1
    Я думаю, что необходимо установить 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"

не Может сказать наверняка, если это - плохая практика. Лично я не вижу очевидной проблемы.

0
ответ дан 10 April 2016 в 09:37
  • 1
    Да, it' s отличающийся. Это имеет тонны патчей сверх версии ванили. – 0andriy 20 August 2017 в 04:07

Отвечать на Ваш точный вопрос:

Да, это - плохая практика, чтобы иметь знак доллара в значении переменной среды. Однако это не то, что на самом деле, делает фрагмент кода, который Вы отобразили.

MY_VAR="$toto"

$ специальный символ к Вашей оболочке (или bash или dash), и, если не защищено от переменного расширения, Вы не будете на самом деле помещать литеральный знак доллара в значение MY_VAR.

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

0
ответ дан 10 April 2016 в 09:37
  • 1
    Спасибо за ответы. Похож на изменение фона, не созданный в функции. – victorjc 17 August 2017 в 19:19

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

Похожие вопросы: