シェル変数がエクスポートされたかどうかはどうすればわかりますか?

シェル変数がエクスポートされたかどうかはどうすればわかりますか?

Bourne シェルファミリと同様に、シェル変数には大文字の名前があります。つまり、名前だけを見ると、特定の変数が環境変数かどうかはわかりません。どのBourneシェル変数がローカルであるか(現在のシェルでのみ定義されている)を確認するには?

答え1

最も移植性に優れた方法はexport -p

export -pエクスポートした変数を一覧表示します。これは通常次のとおりです。declare -xもしあなたのシェルにdeclare

現在使用されている Bourne スタイルのシェルは、以下をサポートする必要があります。export -p、このためPOSIXの要件:

いつ-血任命される、出口エクスポートしたすべての変数の名前と値は、次の形式で標準出力に書き込む必要があります。

"export %s=%s\n", <name>, <value>

もし名前設定されており、次のようになります。

"export %s\n", <name>

もし名前設定されていません。

基準=説明を続けると、通常、変数の値がどのように表示されるかを後で割り当ての右側に使用できます。つまり、参照できるという意味です。他のシェルは異なるように見えるかもしれませんが、効果は同じです。内蔵され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"

POSIX互換性が有効になっていても、Zshは非標準形式を表示します。

$ 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でこのコマンドをテストしました。公式パッケージ版シェルあたり。

答え2

変数がエクスポートされたことを確認するには、次のようにしますdeclare

$ foo=a bar=b
$ export foo
$ declare -p foo bar
declare -x foo="a"
declare -- bar="b"

答え3

変数はいいえエクスポートはbashコマンドの出力で見ることができますdeclare

変わりやすいはいエクスポートはbashdeclare -xまたはコマンド出力で見ることができます。export

関連情報