システムの環境を確認すると、多くの環境変数が表示されます。特定の変数を検索するにはどうすればよいですか?
私が読んでいる本は言う:
環境内の変数の数が非常に多くなる場合があり、1つだけに興味があるときに表示されるすべての値を表示したくない場合があります。この場合、
echo
コマンドを使用して環境変数の現在の値を表示できます。
Linuxターミナルでこれを行うにはどうすればよいですか?
システムの環境を確認すると、多くの環境変数が表示されます。特定の変数を検索するにはどうすればよいですか?
私が読んでいる本は言う:
環境内の変数の数が非常に多くなる場合があり、1つだけに興味があるときに表示されるすべての値を表示したくない場合があります。この場合、
echo
コマンドを使用して環境変数の現在の値を表示できます。
Linuxターミナルでこれを行うにはどうすればよいですか?
回答:
ただ:
echo "$VARIABLENAME"
たとえば、環境変数の$HOME
場合:
echo "$HOME"
次に、次のようなものが出力されます。
/home/username
編集:StéphaneChazelasのコメントによると、次のprintenv
代わりに使用した方が良いかもしれませんecho
:
printenv HOME
printenv VAR
それらはすべて表示されます(少なくともGNU実装の場合)。
実行することにより:
printenv
すべての環境変数が表示されます。詳細については、以下をご覧ください。
printenv
variablename
、名前付き変数のみを表示します。たとえば、printenv HOME
とほぼ同じことを行いecho "$HOME"
ます。
すべてのプロセスには独自の環境変数セットがあることを理解することが重要です。
プロセスがfork()
システムコールを呼び出すと、最初(親)と同じ2番目のプロセス(子)が作成されます(このコピーには、スタックのすぐ上(またはスタックの考え方に応じて、すぐ下にある環境が含まれます)-しかし、unix / linuxでは、スタックは高いアドレスから成長します)。:-)
通常、子プロセスはexecve()
システムコールを呼び出します。システムコールは(仮想)メモリ内のすべてを破棄し、指定されたバイナリファイル内のコードセクションとデータセクションから再構築します。
ただし、スタックを再構築するときexecve()
、main()
関数を呼び出す前に、スタックに渡された環境と引数文字列を最初に(その順序で)コピーします(多くの作業はcrt0
、execve()
リターン後のブートストラップコードで行われます(エントリに)バイナリで指定されたポイント))。
execve()
Cライブラリには、呼び出し元が提供するのではなく、現在の環境(つまり、親環境のコピー)を渡すシステムコールのラッパーがあります(したがって、子は実際に親の環境を継承します)environ(7)
。
コマンドを(rootとして)実行してみてくださいps axeww | less
...これにより、すべてのプロセスの環境が表示されます!興味深いのはプロセスID 1です(つまり、init
プロセス-ブート時にカーネルによって作成される最初のプロセス)。
特定のプロセスの環境を調べたい場合(プロセスIDがわかっている場合)、コマンドを実行してみてくださいcat /proc/<PID>/environ
(<PID>
プロセスIDに置き換えてください)。
プロセスが十分な特権を持っている場合、自身のスタックを書き換えることができるため、その環境を把握するのが難しくなる可能性があります。ps出力にこのようなデーモンプロセスが表示されます。
あなただけ(組み込み)コマンドを使用して、あなたのシェルプロセス内の特定の環境変数の現在の値を確認したい場合はしかし、最終的には、すべてこのワッフルは、@chaosは、上記の言ったことに帰着echo "$<NAME>"
交換(<NAME>
の名前で興味のある環境変数)...同じ変数が別のプロセスで異なる値を持つか、まったく存在しない可能性があることに注意してください。
e
オプションps
と/proc/…/environ
特殊ファイルは、すべてのシステムに存在するわけではないことに注意してください。(2)知る限り、すべての Unixプロセスには、スタックを書き換えて環境変数を変更する特権があります。(3)詳細については、環境変数が誰に属するかを参照してください。(スーパーユーザー)。
ps
があると思いました...しかし、あなたはこの点を強調しているので、なぜ私は思い出せません思いました。
あなたが探しているものを手に入れることができますexport
:
export | grep HOME
$HOME
変数の内容を表示します。
多くの変数を設定する必要がある場合:
( 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 $_ "'
}
echo
変数の内容を変換する可能性があるため、コマンドの適切な選択ではありません。シェルパラメーターの内容を同じ名前で出力します。これは、Bourneシェルを使用している場合は、必ずしも同じではありませんかENVのためのようなvarsは1
、*
例えば。また、シェル変数名として有効でない名前のenv変数には、このアプローチを使用できません。