zsh의 (N) 모드를 사용하기 위해 bash를 활성화하는 방법은 무엇입니까?

zsh의 (N) 모드를 사용하기 위해 bash를 활성화하는 방법은 무엇입니까?

저는 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)

evalPoV 구문에서 이 명령은 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)예를 들어 패턴에는 도움이 되지 않습니다.

관련 정보