저는 zsh와 Bash에서 실행되는 스크립트를 개발하려고 합니다(이상적으로는 동일한 작업을 수행합니다 :-). 문제는 어느 시점에서 zsh의 특정 부분에 (N)
. 그래서: this_pattern*(N)
. zsh에서는 일치하는 항목이 없으면 패턴이 비어 있게 확장됩니다.
Bash는 이에 대해 "예기치 않은 기호로 인해 구문 오류가 발생합니다"라고 말합니다. Bash에서의 실행은 zsh 특정 부분에서는 절대 발생하지 않으며 이 오류 메시지는 구문 분석 코드로 인해 발생합니다!
파싱하지 않는 등의 방식으로 Bash가 이를 먹도록 도울 수 있나요?
답변1
에서 zsh_expn
:
N sets the NULL_GLOB option for the current pattern
따라서 bash 방법은 nullglob
해당 모드에 대한 옵션을 설정하는 것입니다.
( shopt -s nullglob || setopt NULL_GLOB && yourcommand this_pattern* )
에 의해 생성된 서브쉘에 대해서만 이 옵션을 설정하고 작동합니다 (…)
. ( 각각 bash 및 zsh 내장으로 shopt
실패 setopt
하거나 실패하지만 유효한 설정 옵션을 사용하면 일치하지 않는 패턴이 오류 없이 사라지고 왼쪽에서 오른쪽으로 평가됩니다. &&
)||
이것은 확실히 미학이 부족하고(죄송합니다, @StéphaneChazelas!), 서브쉘 생성으로 인해 성능 저하가 있습니다. 하지만 이식성을 원하므로 zsh 특정 기능을 실제로 사용할 수 없습니다.
답변2
zsh 특정 섹션에 있으면 bash 불평을 피할 수 있습니다분석하다코드는 다음을 수행하여 실행되지 않습니다.
eval 'cmd this_pattern*(N)'
바꾸다
cmd this_pattern*(N)
eval
PoV 구문에서 이 명령은 bash에서 유효합니다. 다음과 같은 eval
경우 에만 무효가 됩니다.달리기이 경우 cmd this_pattern*(N)
Bash에서 유효하지 않은 코드를 해석하려고 시도합니다.
이제 이 특정한 경우에는
cmd this_pattern*(N)
bash에서 실제로 작동하는 이 옵션을 활성화하면(완전히 다른 의미이지만) bash는 다음 의미를 extglob
포함하여 ksh 확장 glob 연산자의 하위 집합을 인식합니다.*(something)
0 something
이상.
이 방법:
if [ -n "$BASH_VERSION" ]; then
shopt -s extglob
fi
이 경우 bash의 구문 분석 오류를 사전에 방지할 수 있습니다. *.txt(N)
예를 들어 패턴에는 도움이 되지 않습니다.