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_eval없이 declare직접 수행하면) 작동합니다.

함수 내에서 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"

그/당신은 더 행복해질 것입니다.

요점은 "선언" 문이 작성된 위치가 아니라 실행/평가되는 지점에서 범위를 본다는 것입니다.

관련 정보