zsh: 매개변수 확장을 위해 sh/ksh 에뮬레이션 종료

zsh: 매개변수 확장을 위해 sh/ksh 에뮬레이션 종료

도서관 코드가 있어요가능한zsh(set) 에서 실행되지만 ZSH_VERSION호출자의zsh 가능한sh/ ksh에뮬레이션 모드 에서 . zsh 매개변수 확장(예: 모든 변수 나열)이 필요하므로 다음을 사용해 보았습니다 emulate zsh -c ....

export code='print -rl -- ${(k)parameters}'
zsh --emulate  sh -c 'emulate zsh -c "$code"'  # nothing
zsh --emulate ksh -c 'emulate zsh -c "$code"'  # nothing
zsh --emulate zsh -c 'emulate zsh -c "$code"'  # useless, but works
# emulate -[LR] zsh make no difference

sh그럼... 일단 에뮬레이션 에 들어가면 ksh지금은 나갈 수 없다는 건가요?

답변1

(k)sh 시뮬레이션을 종료할 수 있습니다. emulate내장 명령은 단지 몇 가지 옵션을 설정합니다. 이는 긴 zsh 버전별 setopt명령에 대한 바로가기와 원하는 범위를 얻기 위한 일부 설정입니다.

이 옵션으로 --emulatezsh를 시작하면 일부 옵션을 설정하는 것 이상의 작업이 수행됩니다. 이것수동불행히도 이것은 모호합니다.

셸의 에뮬레이트 명령과 비교하여 원활한 에뮬레이션을 보장하려면 이 옵션을 사용할 때 특정 추가 단계를 수행해야 합니다. 예를 들어 POSIX 사용과 충돌하는 변수(예: 경로)는 셸에서 정의되지 않습니다.

--emulate sh로딩중에 --emulate ksh일어나지 않았거나 로딩 중이던 것 중 하나가기준 치수예를 들어zsh/parameter제공되는 것입니다 $parameters. 필요한 경우 zsh가 에뮬레이션 모드로 시작된 경우에도 명시적으로 로드해야 합니다. 비교:

$ zsh --emulate sh -c 'emulate zsh -c "echo \${(k)modules}"'
$ zsh --emulate sh -c 'zmodload zsh/parameter; emulate zsh -c "echo \${(k)modules}"'
zsh/parameter zsh/main zsh/rlimits

그래서:

$ export code='zmodload zsh/parameter; print -rl -- ${(k)parameters}'
$ zsh --emulate  sh -c 'emulate zsh -c "$code"'
galiases
EGID

관련 정보