zsh 추적에서 예기치 않은 따옴표

zsh 추적에서 예기치 않은 따옴표

나는제3자다음 형식으로 명령줄 인수를 받는 스크립트:

$ ./script.sh --params a=123 b=456

다음 내용을 포함하는 xyz.txt 파일이 있습니다.

c=3
d=4

해당 내용을 스크립트에 대한 인수로 사용하려고 하는데 스크립트에서 올바른 인수를 받지 못한다고 불평합니다. 이렇게 하면 set -x각 매개변수가 작은따옴표로 묶인 것을 볼 수 있습니다(따라서 타사 스크립트가 이를 처리할 수 없음).

$ set -x
$ ./script.sh --params $(cat xyz.txt)

....
+-zsh:20> cat xyz.txt
+-zsh:20> ./script.sh --params 'c=3' 'd=4'

bash에서 (또한 사용하여 set -x) 결과는 예상대로입니다 (작은 따옴표 제외).

$ set -x
$ ./script.sh --params $(cat xyz.txt)

++ cat xyz.txt
+ ./script.sh --params c=3 d=4

파일의 값에 등호가 포함되어 있지 않으면 이 문제가 발생하지 않습니다. 예를 들어

e-5
f-6

... 
+-zsh:20> ./script.sh --params e-5 f-6

가능한 한 많은 기능을 비활성화하려고 시도했지만 setopt성공하지 못했습니다.

Zsh가 등호(Bash 동작 모방)를 포함하는 경우 내 인수를 작은따옴표로 묶는 것을 방지하려면 어떻게 해야 합니까?

답변1

쉘은 매개변수에 작은따옴표를 삽입하지 않습니다.

입증하다:

$ cat file
c=3
d=4
$ printf 'Argument: >>%s<<\n' $(cat file)
Argument: >>c=3<<
Argument: >>d=4<<

이는 읽은 두 줄이 file두 개의 개별 매개변수로 올바르게 분할되어 printf작은따옴표를 추가하지 않고 유틸리티에 전달되었음을 보여줍니다.

다음을 실행할 때 출력이 변경되지 않습니다 set -x.

$ set -x
$ printf 'Argument: >>%s<<\n' $(cat file)
+/usr/local/bin/zsh:11> cat file
+/usr/local/bin/zsh:11> printf 'Argument: >>%s<<\n' 'c=3' 'd=4'
Argument: >>c=3<<
Argument: >>d=4<<

작은따옴표는 스크립트에 전달되는 매개변수의 일부가 아닙니다. 이는 단순히 추적 출력을 위한 시각적 보조 도구로 쉘에 의해 삽입됩니다(이는 디버그 출력이며 쉘에 대한 입력으로 사용되거나 해석될 수 없습니다). 쉘 zshbash추적 출력 형식과 약간 다릅니다. 그게 전부입니다.

쉘에서 스크립트를 실행하는 데 문제가 있는 경우 zsh쉘이 파일의 데이터를 수정하여 문제가 발생한 것이 아닙니다.

관련 정보