
My $PS1
in Zsh에는 다음 표현식이 포함되어 있습니다. %(?. %?.)
이는 "이전 명령( $?
)의 종료 코드가 true이면 show 를 표시하고 $?
, 그렇지 않으면 아무것도 표시하지 않음"을 의미합니다. 이것은 일반적으로 유용하지만 한 가지 짜증나는 점은 명령을 실행하지 않고 Control+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
return 입니다 130
.