tuo (probabilmente semplificato) esempio non presenta il problema che hai citato:
+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ true
+ false
++ echo 'E: failed with exitcode 1'
E: failed with exitcode 1
Le probabilità sono che il comando di ritorno ERR
viene eseguito in una o &&
||
, o soggetta ad altre condizioni menzionato nel frammento di seguito. Citando dal manual:
Se un sigspec è ERR
, il comando arg viene eseguito ogni volta che un semplice comando ha uno stato di uscita diverso da zero, fatte salve le seguenti condizioni . Il ERR
trappola non viene eseguito se il comando non è riuscito fa parte della lista dei comandi che segue immediatamente una parola chiave until
o while
, parte del test seguendo le if
o elif
parole riservate, parte di un comando eseguito in un elenco &&
o ||
oppure se lo stato di ritorno del comando viene invertito utilizzando !
. Queste sono le stesse condizioni osservate dall'opzione errexit
.
Quindi, se avete, per esempio, il seguente:
#! /bin/bash
set -eu
trap 'echo "E: failed with exitcode $?" 1>&2' ERR
false && true
Eseguito non causerebbe il fallimento essere intrappolati:?
+ set -eu
+ trap 'echo "E: failed with exitcode $?" 1>&2' ERR
+ false
penso '$' è corretta. Il tuo copione stampa '1' per me. – dogbane
Hah, so cosa è andato storto. Quando ho provato questa funzione, ho scritto un one-liner e ho sbagliato le quotazioni. Dicendo "trap" echo che esce con $? " ERR' chiaramente non funziona, dal momento che il '$?' Viene valutato alla _definizione_ dell'azione 'trap'. –
Per chiunque cerchi, [una domanda simile è qui] (http://stackoverflow.com/q/32086595/471376). – JamesThomasMoon1979