zsh는 변수를 프로그램에 전달하기 전에 어떻게 변수를 확장합니까?

zsh는 변수를 프로그램에 전달하기 전에 어떻게 변수를 확장합니까?

zsh의 기본 규칙은 변수를 인용할 필요가 없다는 것입니다. 예를 들면 다음과 같습니다.

% data="single argument"
% print -l $data
single argument

제가 알고 있는 한 가지 예외는 매개 변수가 비어 있어도 건너뛸 수 없는 경우 큰따옴표로 묶어야 한다는 것입니다.

% emptyarg=
% functon count() { echo $# }
% count $emptyarg
0
% count "$emptyarg"
1

그러나 매개변수에 특정 특수 문자가 포함되어 있으면 인용 부호로 묶어야 합니다. 그렇지 않으면 쉘에서 오류가 발생합니다. 왜 그런 겁니까? 매우 약해 보입니다. 내 데이터의 내용은 함수/명령이 실행되는 방식에 크게 영향을 주어서는 안 됩니다.

답변1

내 자신의 질문에 답하기 위해 - 스크립트에서 동작이 예상대로 작동하는 것을 확인했습니다(인용 부호 없이도 매개 변수가 확장되지 않음). 특정 옵션으로 인해 문제가 발생할 수 있다는 사실을 깨닫고 setopt이를 대화형 셸과 스크립트에서 실행하고 결과를 비교했습니다. setopt noglobsubst원하는 효과를 찾을 때까지 하나씩 꺼두었습니다 . 간단히 말해서, 이 GLOB_SUBST옵션을 사용하면 zsh는 가능한 경우 모든 변수를 확장할 패턴으로 처리합니다. 이 옵션을 비활성화하고 물결표 매개변수 확장을 사용하여 필요할 때 변수를 확장할 수 있습니다 ~.

% setopt noglobsubst
% star=*
% echo $star
*
% echo $~star
readme.txt test.sh

관련 정보