環境変数の現在値を表示する方法は?


23

システムの環境を確認すると、多くの環境変数が表示されます。特定の変数を検索するにはどうすればよいですか?

私が読んでいる本は言う:

環境内の変数の数が非常に多くなる場合があり、1つだけに興味があるときに表示されるすべての値を表示したくない場合があります。この場合、echoコマンドを使用して環境変数の現在の値を表示できます。

Linuxターミナルでこれを行うにはどうすればよいですか?

回答:


24

ただ:

echo "$VARIABLENAME"

たとえば、環境変数の$HOME場合:

echo "$HOME"

次に、次のようなものが出力されます。

/home/username

編集StéphaneChazelasコメントによると、次のprintenv代わりに使用した方が良いかもしれませんecho

printenv HOME

4
引用符を忘れました(zshまたはrc / es構文を暗示している場合を除く)。echo変数の内容を変換する可能性があるため、コマンドの適切な選択ではありません。シェルパラメーターの内容を同じ名前で出力します。これは、Bourneシェルを使用している場合は、必ずしも同じではありませんかENVのためのようなvarsは1*例えば。また、シェル変数名として有効でない名前のenv変数には、このアプローチを使用できません。
ステファンシャゼル

5
また、同じ名前の複数の環境エントリが存在する場合(OK、病理学的ケース)、どのエントリがシェルに依存するか(通常は最初のものまたは最後のもの)に注意してください。printenv VARそれらはすべて表示されます(少なくともGNU実装の場合)。
ステファンシャゼル

9

実行することにより:

printenv

すべての環境変数が表示されます。詳細については、以下をご覧ください。

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps


2
実際に質問に答えることに近づくためにprintenv variablename、名前付き変数のみを表示します。たとえば、printenv  HOMEとほぼ同じことを行いecho  "$HOME"ます。
G-Manが「Reinstate Monica」と言う

5

すべてのプロセスには独自の環境変数セットがあることを理解することが重要です。

プロセスがfork()システムコールを呼び出すと、最初()と同じ2番目のプロセス()が作成されます(このコピーには、スタックのすぐ上(またはスタックの考え方に応じて、すぐ下にある環境が含まれます)-しかし、unix / linuxでは、スタックは高いアドレスから成長ます)。:-)

通常、子プロセスはexecve()システムコールを呼び出します。システムコールは(仮想)メモリ内のすべてを破棄し、指定されたバイナリファイル内のコードセクションとデータセクションから再構築します。

ただし、スタックを再構築するときexecve()main()関数を呼び出す前に、スタックに渡された環境と引数文字列を最初に(その順序で)コピーします(多くの作業はcrt0execve()リターン後のブートストラップコードで行われます(エントリに)バイナリで指定されたポイント))。

execve()Cライブラリには、呼び出し元が提供するのではなく、現在の環境(つまり、親環境のコピー)を渡すシステムコールのラッパーがあります(したがって、子は実際に親の環境を継承します)environ(7)

コマンドを(rootとして)実行してみてくださいps axeww | less...これにより、すべてのプロセスの環境が表示されます!興味深いのはプロセスID 1です(つまり、initプロセス-ブート時にカーネルによって作成される最初のプロセス)。

特定のプロセスの環境を調べたい場合(プロセスIDがわかっている場合)、コマンドを実行してみてくださいcat /proc/<PID>/environ<PID>プロセスIDに置き換えてください)。

プロセスが十分な特権を持っている場合、自身のスタックを書き換えることができるため、その環境を把握するのが難しくなる可能性があります。ps出力にこのようなデーモンプロセスが表示されます。

あなただけ(組み込み)コマンドを使用して、あなたのシェルプロセス内の特定の環境変数の現在の値を確認したい場合はしかし、最終的には、すべてこのワッフルは、@chaosは、上記の言ったことに帰着echo "$<NAME>"交換(<NAME>の名前で興味のある環境変数)...同じ変数が別のプロセスで異なる値を持つか、まったく存在しない可能性があることに注意してください。


1
(1)のeオプションps/proc/…/environ特殊ファイルは、すべてのシステムに存在するわけではないことに注意してください。(2)知る限り、すべての Unixプロセスには、スタックを書き換えて環境変数を変更する特権があります。(3)詳細については、環境変数が誰に属するかを参照してくださいスーパーユーザー)。
G-Manは「Reinstate Monica」と言う

一部のシステムには、権限のないプロセスがコマンドライン引数や環境を「隠れ」てしまうのを防ぐ方法psがあると思いました...しかし、あなたはこの点を強調しているので、なぜ私は思い出せません思いました。
マレージェンセン

@MurrayJensenは、psで引数を隠している「カール」について私が尋ねた高投票の質問に関するいくつかの議論によると、POSIXでは、psがプロセスに最初に渡された引数を返すのか、それともプロセスが変更したコピーを返すのかは指定されていません始まった。一部のシステム(Solarisと思いますか??)は、元の引数を何でも表示します。 (ここにリンクがあります。) これはあなたが考えていたものであったかもしれません。:)
ワイルドカード

ビンゴ!はい、もちろんSolarisはこれを「正しく」行います:-)復習してくれてありがとう...
マレージェンセン


1

多くの変数を設定する必要がある場合:

  ( set -o posix ; set ) | sort >~/vars.before

それらを設定した後:

  ( set -o posix ; set ) | sort >~/vars.after

設定内容を表示するよりも:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

これにより、cnfファイルで事前定義されたシェル変数の複数のセットを使用して、tmuxと組み合わせることにより、シェル環境での構成管理のマスターになります。

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.