設定解除は何をしますか?

設定解除は何をしますか?

次のunset部分を理解しようとしています。https://unix.stackexchange.com/a/381782/674

unset存在するbash 現在の範囲で宣言されている未設定の変数のみグローバル範囲を除いて宣言を維持します。;プロパティと値を削除し、変数は配列やハッシュではなくなりました。また、namerefsは参照された変数の設定を解除します。それ以外の場合は、上記のスタックから変数レイヤーをポップします。

Bashのマニュアルには、関連内容が記載されていないか、見逃されています。

たとえば、説明してもらえますか?

  • 「現在の範囲で宣言されている未設定の変数のみ」
  • 「これはグローバル例外にもかかわらず明示されています。」

    unset変数が関数のローカルスコープにある場合、変数は設定解除されるだけでなく宣言も解除されませんかunset

    unset変数がグローバルスコープにある場合、unset変数は設定解除されていますが、まだ宣言されていますか?

    変数が宣言されているかどうかを確認するには?

  • 「そうしないと、上記のスタックから変数レイヤーが飛び出します。」

    「そうでなければ」と「可変レイヤー」とはどういう意味ですか?

ありがとうございます。

答え1

たとえば、説明するのが最善です。

$ bash -c 'a=0; f() { local -i a=1; unset a; typeset -p a; a=2; }; f; echo "$a"'
declare -- a
0

これは、unset同じスコープで宣言された変数に対して呼び出されます。正しく設定が解除されました。属性と値は失われましたが、まだ宣言されていますが、それでもその範囲に制限されています。ご覧のとおり、実行していますが、a=2まだaローカルで行われており、f外部スコープのエントリは影響を受けませんでした。これはいいと私たちが望むものです。

存在する:

$ ./bash -c 'a=0; f() { local a=1; g; a=2; }; g() { unset a; echo "$a"; }; f; echo "$a"'
0
2

unset a設定がキャンセルされていないことを確認できますa。むしろそれは以下のもの、すなわち外部球からのものを明らかにする。g返されると、f変数はもはやaローカルではありません。

Bash 5+では、optionsを設定してこの問題を解決できますlocalvar_unset

どこが悪くなるのを見ましたかmkshyashunset飛び出す変える未設定これは、同じスコープで宣言された変数についても同様です。最初の例は次のとおりです。

typeset a=0
2

追加資料:

関連情報