/ etc / environment内の環境変数、値にシャープ記号(ハッシュ)記号


10

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ファイルで機能していないようです。

回答:


5

これは、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。次に、その文字をで上書きします\0

これにより#、以下のすべてが効果的に取り除かれます。注:これはバグではなく機能です。コメント機能です。

だから、この時点で、あなたは内の値持つことはできません/etc/environment含まれている#か、\nまたは\0値の途中でを。また、コードから、キーは英数字である必要があるようにも見えます。


おっと、それを釘付けにした!詳細な説明をありがとうございます。これを承認済みのソリューションとしてマークしました。
ジェイモン2015

3

私はこの制限を回避する方法を見つけることができませんでし/etc/environmentた。ドキュメントに/etc/environmentは、単純な環境ファイルであると記載されているようです:

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ように、グローバル環境変数をのファイルに移動しました。私はまだこの質問には答えないと考えていますが、後世にリンクされた回避策があることを確認したかったのです。


1

/ etc / environmentには、PAMモジュール「pam_env」によって解析されている#(コメントとして扱われる)をエスケープする方法はなく、KEY = VALペアの単純なリストとして扱われ、環境に応じて。これはbash / shellではなく、パーサーには変数の展開や文字のエスケープを行うための言語がありません。


0

単一引用符。

$ FOO='foo#bar'
$ echo $FOO
foo#bar

1
これは最初に試した値の1つでしたが、シェルでは機能しますが、残念ながらで機能しません/etc/environment。試した値の例で質問を更新しました。
ジェイモン2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.