子プロセスの元の変数を上書きせずにローカル変数を宣言できますか?

子プロセスの元の変数を上書きせずにローカル変数を宣言できますか?

既存のENV変数がある場合は、元の値を使用して子プロセスで新しいローカル変数を宣言できますか?

子プロセスがどの変数を使用するのかわからないことに注意してください。したがって、var=original mycmd -with -args元の値を保存してそれを操作するだけでは不十分です。

# print.sh:
echo "from print.sh: $MY_VAR"

# local.sh:
run () {
  declare MY_VAR="should not be seen"
  bash print.sh
}
MY_VAR="original" run

上記は次のように印刷されます。代わりにfrom print.sh: should not be seenfrom print.sh: originallocaldeclarefunction body

いくつかのオプションがあることを望みましたdeclare/local/typesetが、何も見つかりませんでした。この変数の値をローカルに設定しましたが、子プロセスは元の値を使用します。

ベストアンサー1

一般的なルールは、環境変数にはすべて大文字を使用し、スクリプトローカル変数にはすべて小文字を使用することです。これにより、ローカル変数が環境変数と競合しなくなります。

私の考えでは、zshには変数のローカル値とエクスポートされた値を区別するオプションがないと思います。回避策は、値を保存して復元することです。これは、保存する変数を一覧表示することを意味します。

run () {
  typeset -A _saved_variables
  _saved_variables[foo]=$foo _saved_variables[bar]=$bar
  local foo='not seen' bar='not seen either'
  foo=$_saved_variables[foo] bar=$_saved_variables[bar] bash print.sh
}

環境全体を保存するには、typeset -px解析可能な形式で印刷を実行できます。読み取り専用変数をエクスポートした場合は機能しません。この場合を処理するには、変数名を確認し、読み取り専用以外の変数のみを選択する必要があります。

run () {
  _saved_variables=`typeset -px`
  local foo='not seen' bar='not seen either'
  (eval $_saved_variables; exec bash print.sh)
}

別のオプションは、スクリプトを別々に構成することです。子シェルで実行するコマンドを決定し、親シェルで実行できるように印刷(適切に引用)します。

run () {
  # you can clobber variables here
  printf %q "bash print.sh"
}
eval $(run)

おすすめ記事