bashで関数のeval宣言が機能しないのはなぜですか?

bashで関数のeval宣言が機能しないのはなぜですか?

トレーススクリプトbashの奇妙な動作により、次のMWEが発生します。

set -o errexit
set -o nounset
set -x
my_eval()
{
  eval "$1"
}
my_eval "declare -A ASSOC"
ASSOC[foo]=bar
echo success

line 9: foo: unbound variableただし、代わりに使用すると(eval間接なしmy_evaldeclare直接実行すると)動作します。

関数内でlingステートメントを使用することが、eval関数の外部でステートメントを実行するのとは異なる効果があるのはなぜですか?declare

私は人気のディストリビューションGNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)の。UbuntuLinux

ベストアンサー1

manページに移動し、次のことを教えてください。

The -g option forces variables to be created or modified at the
global scope, even when **declare** is executed in a shell function.

したがって、スクリプトが次のように言う場合:

my_eval "declare -gA ASSOC"

彼/あなたはもっと幸せになるでしょう。

要点は、「宣言」ステートメントが作成された場所ではなく、実行/評価される点で範囲を見ることです。

おすすめ記事