Equivalência de teste para status de saída

3

As duas listas de comandos a seguir são portualmente equivalentes?

$foo; echo $? #(1)

e

$foo && echo 0 || echo $? #(2)

Postscript

Considere o comando exit-status definido assim:

#!/bin/sh
exit "$1"

O padrão POSIX proíbe o seguinte?

> exit-status 2 && echo "impossible branch"; echo $?
1

Caso contrário, um shell compatível com POSIX poderá não equacionar as duas listas de comandos superiores. O que não é exatamente o mesmo que não ser portátil ...

    
por Charles Stewart 16.12.2011 / 19:35

1 resposta

3

Ambas as linhas de comando são portáteis. E ambos têm o mesmo efeito.

Em relação ao segundo: no caso de $foo falhar, echo 0 não é avaliado, portanto echo $? imprime o status de saída do último comando, ou seja, $foo .

Os operadores lógicos são associativos à esquerda, ou seja, a segunda linha de comando é equivalente a:

$ { $foo && echo 0 } || echo $? 

(onde o primeiro $ indica o prompt do shell)

Linguagem de Comando da Shell padroniza listas de comandos, associatividade de operadores e assim por diante.

A seção 2.9.3 da Linguagem de comando do shell também especifica a semântica do status de saída do & ; & operador:

Exit Status

The exit status of an AND list shall be the exit status of the last command that is executed in the list.

Em relação ao seu postscript: Sim, o POSIX não permite isso.

    
por 16.12.2011 / 19:51