web-dev-qa-db-ja.com

環境変数の値のドル記号

環境変数の値にドル記号を含めるのは悪い習慣ですか?

例:

MY_VAR="$toto"

より正確には、Javaプログラムからアクセスできるように/etc/environmentファイルに設定したいと思います。私はテストを行い、それは機能していますが、壊滅的な副作用に遭遇しないことを確認したいだけです。変数の値はパスワードであり、ドル記号で始まるため、選択の余地はありません。

2
jon

/etc/environmentの特定のケースでは、いいえ、変数値の$は特別な意味を持ちません。 /etc/environmentpam_env という名前のPAMモジュールによって読み取られるファイルであり、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
muru

あなたの例はあなたの質問を説明していません。

$ toto="somevalue"
$ MY_VAR="$toto"
$ echo $MY_VAR
somevalue
$ 

あなたが尋ねたことを行うには、次のものが必要です。

MY_VAR='$toto'

または

MY_VAR="\$toto"

それが悪い習慣であるかどうか確かに言えません。個人的には、明らかな問題は見当たりません。

9

正確な質問に答えるには:

はい、環境変数の値にドル記号を含めることは悪い習慣です。ただし、これは実際に表示したコードスニペットではありません。

MY_VAR="$toto"

$はシェルの特殊文字(bashまたはdash)であり、変数の展開に対して保護されていない限り、実際にMY_VARの値にリテラルのドル記号を入れることはありません。

そのためには、$をエスケープする必要があります。直前にバックスラッシュを付けるか、または単一引用符で囲みます。

2
Wildcard