Considera i comandi
eval false || echo ok
echo also ok
Normalmente, ci aspettiamo che questo esegua l' false
utilità e, poiché lo stato di uscita è diverso da zero, quindi eseguirà echo ok
e echo also ok
.
In tutto il POSIX come gusci che uso ( ksh93
, zsh
, bash
, dash
, OpenBSD ksh
, e yash
), questo è ciò che accade, ma le cose si fanno interessanti, se permettiamo set -e
.
Se set -e
è attivo, OpenBSD sh
e ksh
shell (entrambi derivati da pdksh
) termineranno lo script durante l'esecuzione di eval
. Nessun altra shell lo fa.
POSIX afferma che un errore in un'utilità integrata speciale (come eval
) dovrebbe causare la chiusura della shell non interattiva. Non sono del tutto sicuro se l'esecuzione false
costituisca "un errore" (se lo fosse, sarebbe indipendente set -e
dall'essere attivo).
Il modo per ovviare a questo sembra essere quello di mettere il eval
sub in una shell secondaria,
( eval false ) || echo ok
echo also ok
La domanda è se mi aspetto che debba farlo in uno script shell corretto da POSIX o se si tratta di un bug nella shell di OpenBSD? Inoltre, cosa si intende per "errore" nel testo POSIX collegato sopra?
Ulteriori informazioni: le shell OpenBSD eseguiranno echo ok
entrambe le operazioni con e senza set -e
nel comando
eval ! true || echo ok
Il mio codice originale sembrava
set -e
if eval "$string"; then
echo ok
else
echo not ok
fi
che non sarebbe uscito not ok
con l' string=false
uso delle shell OpenBSD (sarebbe terminato), e non ero sicuro che fosse progettato, per errore o incomprensione, o qualcos'altro.
eval false
di terminare lo script anche se fa parte di un elenco AND-OR o di un'istruzione condizionale? Non lo farei.
set -e
sia impostato se si tratta del comportamento corretto ... Sono d'accordo sul fatto che abbia senso non terminare in una dichiarazione condizionale.
set -e
quindi `()` è la risposta.
eval false
genera uno stato diverso da zero, quindi mi aspettereiset -e
di terminare lo script a quel punto. Nel caso di!
set -e
non si applica poiché la!
dichiarazione verifica esplicitamente lo stato di uscita.