$를 설정하지 않았나요? 0이 아닌 상태가 되려면 Ctrl+C를 누르세요.

$를 설정하지 않았나요? 0이 아닌 상태가 되려면 Ctrl+C를 누르세요.

My in Zsh에는 $PS1다음 표현식이 포함되어 있습니다. %(?. %?.) 이는 " $?이전 명령( )의 종료 코드가 true이면 이를 표시하고 $?, 그렇지 않으면 아무것도 표시하지 않습니다"를 의미합니다. 이것은 일반적으로 작동하지만 한 가지 버그가 있습니다. 명령을 실행하지 않고 Ctrl+C를 누르면 쉘이 마지막 명령의 반환 코드를 0이 아닌 값으로 설정합니다! Zsh는 1로 설정하고 Bash는 130으로 설정합니다. Dash는 내 시스템에서 Control+C로 재설정하지 않는 유일한 셸입니다.

재현 방법:

  1. zsh 또는 bash를 시작하십시오.
  2. Ctrl+C를 누릅니다.
  3. 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 promptsubstzsh 를 사용하는 경우 .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종료 코드를 1on Ctrl-Cbashto 로 설정하도록 작성합니다 130. 여기, 2019년에 bash둘 다 zsh돌아왔습니다 130.

관련 정보