システム環境を確認してみると環境変数がたくさん出ますね。特定の変数を検索するにはどうすればよいですか?
私が読んでいる本にはこのような言葉があります。
場合によっては、環境内の変数の数が多すぎて、1つの値にのみ興味があるときに表示されるすべての値を見たくない場合があります。この場合、この
echo
コマンドを使用して環境変数の現在の値を表示できます。
Linux端末でこれを行う方法は?
答え1
のみ:
echo "$VARIABLENAME"
たとえば、環境変数の場合は次のようにします$HOME
。
echo "$HOME"
次に、次のように印刷します。
/home/username
編集する:によるとコメント: Stéphane Chazelasprintenv
、代わりに使用する方がecho
良いかもしれません。
printenv HOME
答え2
以下を実行して:
printenv
すべての環境変数が表示されます。詳細については、以下を確認してください。
答え3
各プロセスには独自の一連の環境変数があることを理解することが重要です。
1つのプロセスがfork()
システムコールを呼び出すと、2番目のプロセス(子供)と最初(親)が生成されます(コピースタックの表示方法によっては、すぐ上(または下)の環境が含まれますが、:-)
unix / linuxではスタックが大きくなります。下に高いアドレスから)。
execve()
通常、子プロセスはシステムコールを呼び出して(仮想)メモリ内のすべてを削除します。再建これは、指定されたバイナリのコードとデータセクションから来ます。
しかし、その時再建関数を呼び出す前に、スタックexecve()
に渡された環境文字列とパラメータ文字列を適切な順序でコピーします(return後にブートストラップコードでmain()
多くのことが行われます)。crt0
execve()
エントリポイントバイナリファイルで指定されています))。
Cライブラリには、呼び出し元が提供するのではなく、現在の環境(つまり親環境のコピー)を渡すシステム呼び出し用のexecve()
ラッパーがあります。継承する親環境) - 参照してくださいenviron(7)
。
(root)コマンドを実行してみてくださいps axeww | less
。これにより、次の環境が表示されます。みんなプロセス!興味深いのはプロセスID 1です(つまり、プロセスinit
- 起動時にカーネルによって生成された最初のプロセス)。
特定のプロセスの環境を確認してプロセスIDを知りたい場合は、このコマンドを実行してみてくださいcat /proc/<PID>/environ
(<PID>
プロセスIDに置き換えます)。
プロセスに十分な権限がある場合は、独自のスタックを再構築できるため、環境が何であるかを理解するのは困難です。 ps出力で、このようないくつかのデーモンを見ることができます。
しかし、結局、このすべての言葉にならない音は、@chaosが上記で言ったものとして帰結します。シェルプロセスで特定の環境変数の現在の値を表示するには(組み込み)コマンドを使用します(echo "$<NAME>"
環境<NAME>
変数に置き換えます)。興味がありますか?かもしれません。
答え4
多くの変数を設定する必要がある場合:
( 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 $_ "'
}