My in Zsh에는 $PS1
다음 표현식이 포함되어 있습니다. %(?. %?.)
이는 " $?
이전 명령( )의 종료 코드가 true이면 이를 표시하고 $?
, 그렇지 않으면 아무것도 표시하지 않습니다"를 의미합니다. 이것은 일반적으로 작동하지만 한 가지 버그가 있습니다. 명령을 실행하지 않고 Ctrl+C를 누르면 쉘이 마지막 명령의 반환 코드를 0이 아닌 값으로 설정합니다! Zsh는 1로 설정하고 Bash는 130으로 설정합니다. Dash는 내 시스템에서 Control+C로 재설정하지 않는 유일한 셸입니다.
재현 방법:
- zsh 또는 bash를 시작하십시오.
- Ctrl+C를 누릅니다.
echo $?
.
Zsh에서 이 동작을 해제하는 방법이 있습니까?
답변1
끄는 방법은 없는 것 같아요.
가장 먼저 생각나는 것은 명령이 실행되었음을 나타내기 위해 preexec에 변수를 설정하는 것입니다. 프롬프트가 표시될 때 Ctrl+C를 누르면 설정되지 않습니다.
precmd() {
exit_status=$?
if ! $ran_something; then
exit_status=0
fi
ran_something=false
}
preexec() {
ran_something=true
}
show_non_zero_exit_status() {
case $exit_status in
0)
:;;
*)
echo $exit_status;;
esac
}
PS1='$(show_non_zero_exit_status)$ '
그러나 또 다른 유사한 문제가 있습니다. 명령을 일시 중지하면 종료 상태가 20(zsh < 5.0.7) 또는 148(bash 및 zsh >= 5.0.7)이 됩니다.
이 문제를 해결하려면 위의 설명 20|148
에 다음을 추가할 수 있습니다.case
show_non_zero_exit_status() {
case $exit_status in
0|20|148)
:;;
*)
echo $exit_status;;
esac
}
setopt promptsubst
zsh 를 사용하는 경우 .zshrc
.
Bash를 사용하는 경우 다음을 추가하세요.
PROMPT_COMMAND=precmd
trap preexec DEBUG
하지만 실제로는 앞서 언급한 더 복잡한 DEBUG 트랩을 사용해야 합니다.https://superuser.com/a/175802/15334
또 다른 가능성은 그것이 setopt printexitvalue
당신이 원하는 것에 충분히 가깝다는 것입니다.
답변2
이 질문이 2019년에도 여전히 관심을 끌기를 바랍니다…
130
매우 드문 종료 상태입니다(초기 UNIX 구현에서는 최대 128개의 종료 상태만 인식했다고 생각합니다). 따라서 무시하십시오.
# pseudocode
if exit_status == 0 then
do nothing
else
if exit_status == 130 then
do nothing
else
print " [red]exit_status[/red]"
용어 상으로는 zsh
다음과 같이 번역할 수 있습니다.
%(0?..%(130?.. %F{red}%?%f))
고쳐 쓰다:zsh
종료 코드를 1
on Ctrl-C
및 bash
to 로 설정하도록 작성합니다 130
. 여기, 2019년에 bash
둘 다 zsh
돌아왔습니다 130
.