Bourneシェルファミリーでは、シェル変数はすべて大文字の名前になります。つまり、特定の変数が環境変数であるかどうかは、その名前を見ただけではわかりません。どのBourneシェル変数がローカル(現在のシェル内でのみ定義)であるかをどのように判断しますか?
Bourneシェルファミリーでは、シェル変数はすべて大文字の名前になります。つまり、特定の変数が環境変数であるかどうかは、その名前を見ただけではわかりません。どのBourneシェル変数がローカル(現在のシェル内でのみ定義)であるかをどのように判断しますか?
回答:
export -pです。export -pエクスポートされた変数をリストします。これは通常のようなものですdeclare -x、あれば、あなたのシェルが持ちますdeclare。
現在使用されているBourneスタイルのシェルexport -pは、POSIXで必要とされるため、をサポートする必要があります。
-pが指定されている場合、exportは、エクスポートされたすべての変数の名前と値を次の形式で標準出力に書き込みます。
"export %s=%s\n", <name>, <value>名前が設定されている場合:
"export %s\n", <name>名前が設定されていない場合。
標準では、変数の値は通常=、割り当ての右側で後で使用できるように表示されることを説明しています。これは引用される可能性があるということです。シェルが異なれば表示方法は異なりますが、効果は同じです。Dashのように組み込みのexport -pないシェルでも動作します。declare
$ dash -c 'export -p | grep HOME=' # busybox sh and other ash give the same output.
export HOME='/home/ek'
$ posh -c 'export -p | grep HOME=' # ksh93, mksh, lksh, and others give the same output.
export HOME=/home/ek
grepコンパクトにするために出力をパイプしましたが、フィルタリングしない場合、エクスポートされた変数の完全なリストを取得します。あなたの質問から、それがあなたが最も役立つと思うかもしれないものだと思われます。
Bashなどの一部のシェルは、POSIX準拠の方法で動作するように明示的に指示されていない限り、非標準形式を使用します。Bash export -pではdeclare -x、デフォルトと同じ出力が得られます。
$ bash -c 'export -p | grep HOME='
declare -x HOME="/home/ek"
$ bash -c 'POSIXLY_CORRECT= export -p | grep HOME='
export HOME="/home/ek"
$ bash -c 'set -o posix; export -p | grep HOME='
export HOME="/home/ek"
$ bash --posix -c 'export -p | grep HOME='
export HOME="/home/ek"
$ ln -s /bin/bash sh
$ ./sh -c 'export -p | grep HOME=' # Invoking bash as sh also puts it in POSIX mode.
export HOME="/home/ek"
Zshは、POSIX互換性が有効になっている場合でも、非標準形式を示します。
$ zsh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
$ zsh -c 'emulate -R sh; export -p | grep HOME='
typeset -x HOME=/home/ek
$ ln -s /bin/zsh sh
$ ./sh -c 'export -p | grep HOME='
typeset -x HOME=/home/ek
いずれの場合でも、単語の後に=。これは、行頭の直前の単語に依存し=ません。ただし、がすぐに先行しない限り、そうすべきではありません。例えば:
% export -p | grep -oE '\w+=.*'
HOME=/home/ek
LANG=en_US.UTF-8
LESSCLOSE='/usr/bin/lesspipe %s %s'
....
すべてのエントリに必ずしもがあるわけではないことに注意してください=。これは、変数を設定解除してエクスポートすることができるためです。これらのエントリは、grep上記のコマンドによって除外されます。これは、必要な場合とそうでない場合があります。
時間のほとんどは、あなただけの出力を検査して、エントリがが先行している場合は気にしないようにしたいexport、declare -x、typeset -x、または何か他のもの。次に、実行しexport -pます。
これらのコマンドをUbuntu 16.04 LTSでテストし、公式にパッケージ化されたバージョンの各シェルを使用しました。