도서관 코드가 있어요가능한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
명령에 대한 바로가기와 원하는 범위를 얻기 위한 일부 설정입니다.
이 옵션으로 --emulate
zsh를 시작하면 일부 옵션을 설정하는 것 이상의 작업이 수행됩니다. 이것수동불행히도 이것은 모호합니다.
셸의 에뮬레이트 명령과 비교하여 원활한 에뮬레이션을 보장하려면 이 옵션을 사용할 때 특정 추가 단계를 수행해야 합니다. 예를 들어 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