シェル変数がエクスポートされるかどうかをどのように判断しますか?


13

Bourneシェルファミリーでは、シェル変数はすべて大文字の名前になります。つまり、特定の変数が環境変数であるかどうかは、その名前を見ただけではわかりません。どのBourneシェル変数がローカル(現在のシェル内でのみ定義)であるかをどのように判断しますか?


4
Bourne shellまたはBourne-again shell?大文字の変数のものの参照を指すことができますか?
ジェフシャラー

Bourne-againシェルでは、すべての変数が大文字であるため、どのbash変数がローカルであるかをどのように判断できますか?
ショルダー

7
@Shoulderpadzは、小文字の変数の作成を妨げるものは何もありません。
muru

1
ローカルエクスポートされていない変数を意味するのですか?
Eliah Kagan 2017

4
あなたが求めている違いは、グローバル変数とローカル変数ではなく、シェル変数と環境変数です。環境変数ではないシェル変数(つまり、「ローカル」と呼んでいるもの)があり、シェル変数ではない環境変数があることに注意してください(環境には有効なシェル識別子ではない名前が含まれている可能性があるため、変数にすることはできません)。
chepner 2017

回答:


17

変数がエクスポートされているかどうかを確認するには、次を使用しますdeclare

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

26

最もポータブルな方法は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上記のコマンドによって除外されます。これは、必要な場合とそうでない場合があります。

時間のほとんどは、あなただけの出力を検査して、エントリがが先行している場合は気にしないようにしたいexportdeclare -xtypeset -x、または何か他のもの。次に、実行しexport -pます。

これらのコマンドをUbuntu 16.04 LTSでテストし、公式にパッケージ化されたバージョンの各シェルを使用しました。


0

エクスポートされない変数はdeclare、bash のコマンドの出力から確認できます。

エクスポートされた変数、bashの出力declare -xまたはexportコマンドから確認できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.