Io uso set -e
all'interno di (...)
sulla riga di comando ma non esce dalla sottoshell quando viene eseguito il comando false
.Subshell creato usando (...) si comporta diversamente da bash -c '...'
Codice 1:
(set -e; echo "$BASHPID: start"; false; echo "foobar"; date;) &&
echo "$BASHPID: ok" || echo "$BASHPID: nope"
9136: start
foobar
Wed, Apr 29, 2015 7:14:24 PM
7292: ok
Tuttavia se uso bash -c
per la creazione di subshell poi si comporta come mi aspetto.
Codice 2:
bash -c 'set -e; echo "$BASHPID: start"; false; echo "foobar"; date;' &&
echo "$BASHPID: ok" || echo "$BASHPID: nope"
7880: start
7292: nope
È interessante notare che se tolgo &&
e ||
parte dopo subshell poi (...)
comporta anche bene.
Codice 3:
(set -e; echo "$BASHPID: start"; false; echo "foobar"; date;)
5940: start
Così conclusioni che sto ottenendo sono:
(...)
si comporta in modo diverso dabash -c
(...) && false
si comporta in modo diverso da(...)
e cambia il comportamento di subshell pure.
Sto facendo un errore evidente nell'interpretare questo comportamento strano (almeno per me)?
Il comportamento di 'set -e' con' && 'è intenzionale. Non si attiva esplicitamente quando il comando fa parte di una sequenza '&&'. Questo è nel manuale. Presumo che la differenza qui sia se la shell conosce questo fatto. '(...)' presumibilmente fa perché la shell corrente la esegue e 'bash -c' presumibilmente no perché è un processo completamente esterno (o qualcosa del genere). –
Ah, vedo che '&&' fa la differenza solo per sottoshell creato usando '(...)' ma non per le sotto shell create usando 'bash -c', interessante. Ho imparato qualcosa di nuovo. – anubhava
@EtanReisner: Credo che dovresti convertire il tuo commento in una risposta. – anubhava