/etc/environmentの構文はどこに文書化されていますか?

/etc/environmentの構文はどこに文書化されていますか?

/etc/environment.confの正確な構文を知りたいです。私はこれが一般的なシェルスクリプトではないことを知っていますが、一重引用符と二重引用符は正確にどのように処理されますか?

ファイルの前半で定義された環境変数を使用して、後で変数を定義できますか?

脱出はどのように行われますか?値にスペースがある場合はどうなりますか?

また - ファイルはいつ処理されますか?オンラインで矛盾する情報は、システムの起動時に、ユーザーがログインするたびに、またはその両方で処理されると言います。

オンラインでこれらの詳細が見つかりません。誰かが私に権威ある文書を教えてもらえますか?

重要な場合は、特にUbuntu(Debian)に興味があります。

答え1

奇妙です、私は以前これをテストしたことがあります。この行動はちょっと…変です。

これらの設定は次の場所にあります/etc/environment

FOO1=bar
FOO2="bar"
FOO3="bar
FOO4=bar"
FOO5='bar'
FOO6='bar"
export FOO7=bar
FOO8=bar bar bar
#FOO9=bar
FOO10=$PATH
FOO11="foo#bar"

次の環境変数が与えられた場合:

FOO1=bar
FOO2=bar
FOO3=bar
FOO4=bar"
FOO5=bar
FOO6=bar
FOO7=bar
FOO8=bar bar bar
FOO10=$PATH
FOO11=foo

言い換えれば:

  • 先行をスキップしますexport(7)。
  • 値が一重引用符または二重引用符で始まる場合、値と末尾の一重引用符または二重引用符は削除されます。 (2、5)
  • ...しかし、引用符が一致しないか、引用符が欠落してもかまいません(3、6)。
  • 引用符がなくてもスペースを特に処理しません。 (8)
  • ...ここに表示するのが難しい末尾のスペースはありませんが、テストしました(8)。
  • #(9) で始まる行は無視されます。
  • #...そして引用符の間にあっても、aで行を切り取ります。 (11)
  • 変数拡張をサポートしていません(10)

で読んpam_env.soだのでログインしたいです。pam_envマンページまたはenvironmentマニュアルページしかし、引用符の処理については言及しません。テストに加えて、コードの動作を解析する必要があります。ラスケスの答え次に接続。

私はシェルの起動ファイルに入れた割り当てを受け入れて、両方で同じことをしようとしていると思いますexport FOO="bar bar"(末尾のスペースがない場合)。ただforの構文がはるかに簡単だということです/etc/environment(私の考えには愚かなほど)。

/etc/environment変数拡張などもサポートされていません。前述のように、$PATHファイルの値は$PATHディレクトリリストではなくテキストで終わります。

上記のマニュアルページにも説明されており、構文が豊富でpam_env.conf変数の拡張が可能です。しかし、それでもシェル構文ではありません。

関連:

答え2

ファイル/etc/environmentを読む人は次のとおりです。pam_env残念ながら、公式文書では、次のような形式は明確ではありません。

構文は、別の行にある単純なKEY = VALペアです。 bash 互換性のためにエクスポートディレクティブを指定できますが、無視されます。これは、さまざまなサービスにさまざまな環境が必要な場合に便利です。

本当に気になるなら、実際の解析ロジックは次のようになります。_parse_env_file機能PAMソースから。具体的には:

  /* now we try to be smart about quotes around the value,
     but not too smart, we can't get all fancy with escaped
     values like bash */
    if (key[i] == '=' && (key[++i] == '\"' || key[i] == '\'')) {
        for ( t = i+1 ; key[t] != '\0' ; t++)
            if (key[t] != '\"' && key[t] != '\'')
                key[i++] = key[t];
            else if (key[t+1] != '\0')
                key[i++] = key[t];
        key[i] = '\0';
    }

答え3

2番目、4番目、5番目の質問に回答します。

このファイルのドキュメントは次の場所にあります。マンページ(man 5 pam_env.conf)

/etc/environment後で読み取られ、pam_env.confユーザーman 5 pam_env.confがログインしたときにこのファイルを読み取ることを示します。

デフォルトではファイルkey=valueの行のみ/etc/environment。マニュアルページには、このファイルを使用して/etc/security/pam_env.conf存在しない他の変数に環境変数を設定できることが示されています。

マニュアルページで次の情報を確認してください/etc/security/pam_env.conf

各行は変数名で始まり、各変数には2つの可能なオプションがありますDEFAULT。値が指定されていない場合は、空の文字列であると仮定して、管理者は変数の値をいくつかのデフォルト値に設定できます。このオプションは、使用する値がある場合にその値を入力する必要があることを示します(デフォルトは無視)。使用されない場合は仮定され、上書きされません。OVERRIDEDEFAULTOVERRIDEpam_envOVERRIDE""

VARIABLE [DEFAULT=[value]] [OVERRIDE=[value]]

(存在しない可能性がある)環境変数は${string}この構文を使用して値に使用でき、(存在しない可能性がある)PAM_ITEMもこの構文を使用して値に使用できますHOME。文字はリテラル値として使用するためにバックスラッシュにエスケープできます。値はバックスラッシュで区切ることができます。エスケープはサポートされていません。使用する多くの環境変数は、モジュールが呼び出されたときに設定されていない可能性があります。たとえば、次は複数回使用されますが、多くのPAMアプリケーションでは必要に応じて使用できません。特殊変数は、ユーザーのpasswdエントリ値に展開されます。SHELL@{string}$@"""${HOME}@{HOME}@{SHELL}

/etc/environment ファイルは、設定する環境変数を指定します。ファイルは、別の行に単純なNAME = VALUEペアで構成する必要があります。 pam_env(8) モジュールは pam_env.conf ファイルの後に続くファイルを読み込みます。

シェル(bashやzshなど)構成ファイルを使用したり、同様の環境変数を設定したりすることもできます。

関連情報