$를 설정하지 않습니까? Control+C에서 0이 아닌 값으로

$를 설정하지 않습니까? Control+C에서 0이 아닌 값으로

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

관련 정보