추적 스크립트 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"
그/당신은 더 행복해질 것입니다.
요점은 "선언" 문이 작성된 위치가 아니라 실행/평가되는 지점에서 범위를 본다는 것입니다.