Por que códigos de alta saída em shells do Linux (= 256) não funcionam como esperado?

1

Eu descobri um comportamento estranho (reproduzível com zsh e bash no meu sistema):

$ # here everything is still normal
$ bash -c 'exit 1';echo $?
1
$ bash -c 'exit 255';echo $?
255
$ zsh -c 'exit 255';echo $?
255
$ # now it get's crazy
$ bash -c 'exit 256';echo $?
0
$ zsh -c 'exit 256';echo $?
0
$ # (leaving away zsh for now, it is always reproducible with both)
$ bash -c 'exit 257';echo $?
1
$ bash -c 'exit 267';echo $?
11

Então, depois de 256, começa a contar a partir de 1 novamente. Mas por que?

A página man bash não indica que há um número máximo:

   exit [n]
          Cause  the  shell  to exit with a status of n.  If n is omitted,
          the exit status is that of the last command executed.  A trap on
          EXIT is executed before the shell terminates.

E isso é um comportamento altamente confuso. Se os programas dependem disso, isso pode levar a grandes problemas.

Então, por que isso acontece? E por que não está documentado?

x64, Fedora 26

    
por rugk 26.09.2017 / 23:44

2 respostas

2

A página de manual do POSIX para o comando shell exit(1p) states:

SYNOPSIS

exit [n]

DESCRIPTION

The exit utility shall cause the shell to exit with the exit status specified by the unsigned decimal integer n. If n is specified but its value is not between 0 and 255 inclusive, the exit status is undefined.

Assim, para shells em conformidade com as especificações POSIX, esse comportamento não é documentado, mas também não é necessariamente portátil.

    
por 27.09.2017 / 00:01
2

Está documentado no manual da função do sistema sair :

The value of status may be 0, EXIT_SUCCESS, EXIT_FAILURE, [CX] [Option Start] or any other value, though only the least significant 8 bits (that is, status & 0377) shall be available to a waiting parent process. [Option End]

O Linux parece manter-se fiel ao padrão e não permite mais que apenas os últimos 8 bits.

    
por 26.09.2017 / 23:54