システムの環境を確認すると、多くの環境変数が表示されます。特定の変数を検索するにはどうすればよいですか?
私が読んでいる本は言う:
場合によっては、環境内の変数の数が非常に多くなり、1つだけに関心があるときに表示されるすべての値を表示したくない場合があります。この場合は、
echo
コマンドを使用して、環境変数の現在の値を表示できます。
Linux端末でこれを行うにはどうすればよいですか?
ただ:
echo "$VARIABLENAME"
たとえば、環境変数$HOME
、 使用する:
echo "$HOME"
次に、次のようなものを出力します。
/home/username
Edit: StéphaneChazelasのコメント によると、代わりにprintenv
を使用した方が良い場合がありますecho
:
printenv HOME
実行すると:
printenv
すべての環境変数が表示されます。詳細については、以下をご覧ください。
すべてのプロセスには独自の環境変数のセットがあることを理解することが重要です。
プロセスがfork()
システムコールを呼び出すと、2番目のプロセス(child)は最初のプロセスと同じ(the parent)が作成されます(このcopyには、スタックのすぐ上(またはスタックの考え方に応じてすぐ下)にある環境が含まれます:-)
-unix/linuxではスタックはdownの上位アドレスから増加します)。
通常、子プロセスは次にexecve()
システムコールを呼び出します。これにより、その(仮想)メモリ内のすべてが破棄され、指定されたコードおよびデータセクションからreconstructになります。バイナリーファイル。
ただし、reconstructsスタックの場合、execve()
関数を呼び出す前に、main()
に渡された環境文字列と引数文字列を最初に(この順序で)スタックにコピーしますcrt0
bootstrapコードでexecve()
が(エントリポイントに指定された後)戻った後)、作業の一部が実行されます)。
Cライブラリには、呼び出し元が提供する代わりに、現在の環境(つまり、親環境のコピー)を渡すexecve()
システムコールのラッパーがあります(つまり、子はになります)継承親の環境)-environ(7)
を参照してください。
ps axeww | less
コマンドを(rootとして)実行してみてください...これにより、allプロセスの環境が表示されます!興味深いのは、プロセスID 1(つまり、init
プロセス-ブート時にカーネルによって作成された最初のプロセス)です。
特定のプロセスの環境を確認したい場合(そしてそのプロセスIDがわかっている場合)、cat /proc/<PID>/environ
コマンドを実行してみてください(<PID>
をプロセスIDで置き換えます)。
プロセスが十分な特権を持っている場合、それはそれ自身のスタックを書き換えることができることに注意してください、それはその環境が何であるかを知るのを難しくする可能性があります-ps出力でこのようないくつかのデーモンプロセスを見るでしょう。
しかし、結局のところ、このすべてのワッフルは上記の@chaosが言ったことに要約されます。シェルプロセスの特定の環境変数の現在の値を確認したい場合は、(ビルド)コマンドecho "$<NAME>"
(<NAME>
を関心のある環境変数の)...同じ変数が別のプロセスで異なる値を持つか、まったく存在しない可能性があることに注意してください。
多くの変数を設定する必要がある場合:
( 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 $_ "'
}
export
を使用して、探しているものを取得できます。
export | grep HOME
$HOME
変数の内容を表示します。