Não define $? para diferente de zero no controle + C

5

Meu $PS1 em Zsh inclui esta expressão: %(?. %?.) Significa «se o código de saída do comando anterior ( $? ) for verdadeiro, mostre $? , senão mostre nada». Isso geralmente é útil, mas uma coisa me irrita: shells set código de retorno do último comando para diferente de zero quando eu pressiono Control + C sem executar um comando! Zsh o define para 1, Bash o define para 130. Dash é o único shell no meu sistema que não o redefine no Control + C.

Como reproduzir:

  1. Inicie o zsh ou o bash.
  2. Pressione Control + C.
  3. echo $? .

Existe uma maneira de desativar esse comportamento no Zsh?

    
por Mischa Arefiev 12.10.2013 / 20:58

1 resposta

4

Eu não acho que haja alguma maneira de desativá-lo.

O primeiro pensamento é ter o preexec definido uma variável que indica que um comando foi executado. Se você pressionasse Ctrl + C no prompt, não seria definido.

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)$ '

Mas há outro problema semelhante: se você suspender um comando, obterá o status de saída 20 (zsh < 5.0.7) ou 148 (bash e zsh > = 5.0.7).

Para contornar isso, você pode adicionar 20|148 à declaração case acima, por exemplo

show_non_zero_exit_status() {
    case $exit_status in
    0|20|148)
        :;;
    *)
        echo $exit_status;;
    esac
}

Se você estiver usando zsh, verifique se tem setopt promptsubst em .zshrc .

Se você estiver usando o bash, adicione:

PROMPT_COMMAND=precmd
trap preexec DEBUG

mas você deve usar a armadilha DEBUG mais complicada mencionada no link

Outra possibilidade é que setopt printexitvalue esteja perto o suficiente do que você deseja.

    
por 12.10.2013 / 21:59