子プロセスのエクスポートされた変数を変更しない「ローカル」機能を持つシェルは何ですか?

子プロセスのエクスポートされた変数を変更しない「ローカル」機能を持つシェルは何ですか?

次の例では、export関数と同様に ed 変数がリセットされます。localBash、Zsh、Fishは生の値を子プロセスに渡しません。localローカル関数の本文にのみ影響し、元のexported値を子プロセスに渡すシェルはありますか?

function the_func {
  local MY_VAR="new value"

  echo "=== $MY_VAR"  # === prints "new value"
  my -child -process  # === gets MY_VAR="original"
}

export MY_VAR="original"
the_func

サブシェルと読み取り専用変数は不十分です。なぜなら、これらの変数はサブシェルの外部でも必要なからです。コマンドの引数または名前は、子プロセスとして分類できる変数に含めることができます。

ベストアンサー1

  1. ムケシ
  2. .declare +x MY_VAR=valuelocal +xtypeset +x

ただし、Bashでは、次の条件で失敗します。

my_func () {
   local +x MY_VAR="..."
   bash my.sh  # ERROR in Bash: this gets "original" instead of "2nd def"
               # Works in mksh: "2nd def" is passed.
}
export MY_VAR="original"
MY_VAR="2nd def" my_func

直感的に表現されています。ムケシ

おすすめ記事