Ubuntu 12.04では、/etc/environment
に次のように定義された環境変数があります。
FOO="value_before#value_after"
サーバーにsshして値を確認すると、次のようになります。
$ env | grep FOO
FOO=value_before
私はそれが#
をコメントとして扱い、それを取り除いていると思いますが、これはうまくいきます:
$ . /etc/environment
$ export FOO
$ env | grep FOO
FOO=value_before#value_after
私は#
を次のようにエスケープしてみました:
FOO="value_before\#value_after"
しかし、それはうまくいきません、代わりに私はこれを取得します:
FOO=value_before\
ハッシュを値の一部のように扱う方法についてのアイデアはありますか?どんな助けでも素晴らしいでしょう。
/etc/environment
ファイルで試した値:
FOO='value_before#value_after'
FOO="value_before#value_after"
FOO='"value_before#value_after"'
FOO="value_before\#value_after"
FOO='value_before\#value_after'
上記の他のさまざまな組み合わせ。これらの多くは、通常シェルで設定するだけで機能します。ただし、/etc/environment
ファイルでは機能しないようです。
これは、pam_envモジュールによって読み取られます。 pam_envモジュールは、それらが「単純な」KEY = VALUEペア(引用符は不要)であると想定し、#で識別されるコメントもサポートしているため、VALUE内の#とそれに続くものはすべてコメントであると想定します。また、エスケープの概念をサポートしていないことにも注意してください。
これは、 pam_env.c の_parse_env_file関数の次のスニペットで確認できます。
/* now find the end of value */
mark = key;
while(mark[0] != '\n' && mark[0] != '#' && mark[0] != '\0')
mark++;
if (mark[0] != '\0')
mark[0] = '\0';
上記のスニペットは、\n
、#
、または\0
が見つかるまで、VALUE部分の各文字をウォークします。次に、その文字を\0
で上書きします。
これにより、#
とその後のすべてが効果的に取り除かれます。 注:これは機能でありバグではありませんバグです。コメント機能です。
そのため、この時点では、/etc/environment
の値の中央に#
または\n
または\0
を含む値は使用できません。また、コードから、キーは英数字である必要があるようにも見えます。
私は/etc/environment
でこの制限を回避する方法を見つけることができませんでした。ドキュメントには/etc/environment
が simple 環境ファイルであると記載されているようです:
This module can also parse a file with simple KEY=VAL pairs on separate
lines (/etc/environment by default).
これは、 ドキュメントの他の場所でこれが可能であると多分言われているにもかかわらず、引用符または\
文字を使用して値をエスケープできないことを意味する可能性があります :
(Possibly non-existent) environment variables may be used in values using
the ${string} syntax and (possibly non-existent) PAM_ITEMs may be used in
values using the @{string} syntax. Both the $ and @ characters can be
backslash escaped to be used as literal values values can be delimited with ""
The file is made up of a list of rules, each rule is typically placed on a
single line, [...] Comments are preceded with `#´ marks and extend to the
next end of line.
とにかく、この制限を回避するために、私はグローバル環境変数を/etc/profile.d
のファイルに移動し、この回答で議論されたとしました。私はまだこの質問には答えないと考えていますが、後世にリンクされた回避策があることを確認したかったのです。
/ etc/environmentには、PAMモジュール「pam_env」によって解析されている#(コメントとして扱われる)をエスケープする方法はなく、KEY = VALペアの単純なリストとして扱われ、環境に応じて。これはbash/Shellではなく、パーサーには変数の展開や文字のエスケープを行うための言語がありません。
単一引用符。
$ FOO='foo#bar'
$ echo $FOO
foo#bar