Por que o bash define $? (status de saída) para diferente de zero em Ctrl-C ou Ctrl-Z?

4

No manual bash, na $? variável :

$? Expands to the exit status of the most recently executed foreground pipeline.

Gostaria de saber por que o bash atualiza a variável $? ao pressionar Ctrl-C ou Ctrl-Z :

$ echo $?
0
$ ^C
$ echo $?
130
$ sleep 10
^Z
[1]+  Stopped                 sleep 10
$ echo $?
148
    
por Eugene Yarmash 28.12.2015 / 21:39

3 respostas

4

Nada sai, mas o manipulador de SIGINT ( sigint_sighandler() ) define o status de saída para 130 (128 + 2, como explica a resposta do DopeGhoti):

if (interrupt_immediately)
  {
    interrupt_immediately = 0;
    last_command_exit_value = 128 + sig;
    throw_to_top_level ();
  }

E em throw_to_top_level() :

if (interrupt_state)
  {
    if (last_command_exit_value < 128)
    last_command_exit_value = 128 + SIGINT;
    print_newline = 1;
    DELINTERRUPT;
  }
    
por 28.12.2015 / 22:29
5

Porque 0 é o código de saída para um estado de saída normal.

A interceptação de um sinal de Interrupção ou Interrupção não é um estado de saída usual, nem está sendo suspenso para o segundo plano. Os códigos de saída diferentes de zero informam que isso é o que está acontecendo para que você possa reagir de acordo com um script se o trabalho que ele disparar for interrompido ou interrompido convencionalmente com um estado sem erro.

A sessão do shell interativo, quando você pressiona ^ C , que lança um sinal SIGINT (sinal 2), anula a entrada do comando interativo atual, que é um estado não-normal para a entrada de comando (ou seja, o prompt de comando) para estar em. Isso faz com que ele retorne o status 130 (128 + 2) e forneça um novo prompt.

Mais detalhes podem ser encontrados no link .

    
por 28.12.2015 / 21:52
1

O padrão diz que o valor em $? no caso de um sinal recebido é > 128 , mas o padrão não diz como isso deve ser feito.

O Bourne Shell define $? no caso de um singal, ele usa 128 + signal number

ksh93 usa 256 + signal number

Observe que apenas os números de sinal 1, 2, 3, 6, 9, 14 e 15 são portáteis.

Em outras palavras: SIGTSTP e SIGSTOP usam números não portáteis.

Por esse motivo, a Bourne Shell lançou recentemente um novo sistema portátil, consulte o link a variável $ {. sh.termsig}.

    
por 28.12.2015 / 23:38

Tags