Io non capisco, onestamente, perché fai tornare la funzione con 2, che non è un EXIT_SUCCESS.
In sostanza stai dicendo in quello script che qualunque cosa succeda quella funzione, essa debba uscire sempre in errore.
Se la funzione infatti tornasse 0 in caso di successo, per ottenere il risultato sperato ti basterebbe utilizzare un banale "set -e".
Codice: Seleziona tutto
#!/bin/bash -e
function pippo(){
if [ -z "$1" ];then
echo "ABORT"
return 1
fi
out=$1
echo paperino
}
a=$(pippo ciao)
echo $?
echo $out
echo $a
b=$(pippo)
echo $?
echo $b
echo end
che giustamente stampa
Per quanto riguarda la definizione della variabile $out, il concetto è IMHO sbagliato alla radice.
Una variabile non dovrebbe mai avere scope globale se definita all'interno di una funzione, in quanto quest'ultima è ad un livello logico inferiore rispetto al codice chiamante.
Difatti, io per mantenere un minimo di scoping decente, cerco sempre di gestire le variabili all'interno di una funzione dichiarandole local. Purtroppo, anche questo non basta, perché lo scoping di bash non funziona come dovrebbe, in quanto una variabile local è comunque global per le funzioni che vengono chiamate dalla funzione stessa.
Quello che voglio dire è che se il compito di $out è stampare l'argomento a schermo, senza che esso venga trappato dalle variabili $a e $b che in caso di successo dovrebbero solo trappare "paperino", ti conviene usare lo standard error, che poi è ciò che dovresti usare anche per ABORT, in quanto gli errori dovrebbero sempre andare in /dev/stderr e redirezionati in /dev/stdout all'occorrenza.
Ovvero:
Codice: Seleziona tutto
#!/bin/bash -e
function pippo(){
if [ -z "$1" ];then
echo "ABORT" > /dev/stderr
return 1
fi
echo $1 > /dev/stderr
echo paperino
}
a=$(pippo ciao)
echo $?
echo $a
b=$(pippo)
echo $?
echo $b
echo end
che stampa a schermo
Questo è come gestire occhio e croce il tuo esempio, senza stravolgere più di tanto il codice.
Naturalmente, se hai delle necessità tali per cui la funzione pippo() deve tornare necessariamente 2, allora si può gestire, ma IMHO faresti meglio a verificare se tale eccezione alla regola sia davvero necessaria, visto che rendi il codice meno pulito.