トレーススクリプト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_eval
でdeclare
直接実行すると)動作します。
関数内でlingステートメントを使用することが、eval
関数の外部でステートメントを実行するのとは異なる効果があるのはなぜですか?declare
私は人気のディストリビューションGNU bash, version 4.3.46(1)-release (x86_64-pc-linux-gnu)
の。Ubuntu
Linux
答え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"
彼/あなたはもっと幸せになるでしょう。
要点は、「宣言」ステートメントが作成された場所ではなく、実行/評価される点で範囲を見ることです。