Pagina 1 di 1

BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 16:00
da anycolouryoulike
Ho in uno script un ciclo for che lancia una funzione in più directory:

Codice: Seleziona tutto

share() {
[...]
elif [ -n "$WAV" ]
then
    echo 1
    IFS=$'\n' flac -V $WAV
    [ -n "$CUE" ] && IFS=$'\n' cuetag "$CUE" $WAV
    echo 2
else
    cuetag "$CUE" "$AUDIO"
fi
echo 3
}
for s in $CDS
do
    cd "$TMP"
    cd "$s"
    share
done
Nel caso in cui lo sto provando le directory $CDS sono 2.
La cosa strana è che normalmente non funziona bene, lanciando la funzione "share" solo nel primo $CDS.
Invence quando aggiungo qualche echo per capire dove si blocca, funziona come dovrebbe.
All'inizio dello script c'è un set -e, non so se può c'entrare...
Davvero non capisco...
Qualche idea?
Grazie

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 16:21
da anycolouryoulike
Togliendo il set -e in effetti prosegue...
Ma quegli echo che ruolo avrebbero nel non far terminare lo script col set -e?

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 16:44
da anycolouryoulike
Facendo ulteriori prove, ho appurato che basta un qualsiasi comando dopo il "fi", per non far terminare male la funzione. :-k

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 17:37
da 414N
anycolouryoulike ha scritto:Facendo ulteriori prove, ho appurato che basta un qualsiasi comando dopo il "fi", per non far terminare male la funzione. :-k
È normale.
In BASH, il valore di ritorno delle funzione è l'exit status dell'ultimo comando lanciato al loro interno.
Aggiungendo "echo 3" forzi la funzioni a non fallire (in man bash è scritto che la echo builtin resistuisce sempre 0).
È possibile forzare fallimenti oppure avanzamenti nel codice tramite i comandi true e false. Per esempio:

Codice: Seleziona tutto

comando_che_può_fallire || true
ti consente di evitare il fallimento di tutto lo script se hai usato set -e.

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 17:38
da Blallo
Prova a dare

Codice: Seleziona tutto

cuetag $BLAH $BLAH || true
non dovrebbe più dare problemi, evitando istruzioni inutili
E comunque vicino a

Codice: Seleziona tutto

elif [ -n "$WAV" ]
non manca un punto e virgola?

EDIT: ti hanno già risposto :D

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 19:35
da anycolouryoulike
jimmy_page_89 ha scritto:Prova a dare

Codice: Seleziona tutto

cuetag $BLAH $BLAH || true
non dovrebbe più dare problemi, evitando istruzioni inutili
E comunque vicino a

Codice: Seleziona tutto

elif [ -n "$WAV" ]
non manca un punto e virgola?

EDIT: ti hanno già risposto :D
Se c'è il newline non dovrebbe essere necessario...
414N ha scritto:È normale.
In BASH, il valore di ritorno delle funzione è l'exit status dell'ultimo comando lanciato al loro interno.
Aggiungendo "echo 3" forzi la funzioni a non fallire (in man bash è scritto che la echo builtin resistuisce sempre 0).
È possibile forzare fallimenti oppure avanzamenti nel codice tramite i comandi true e false. Per esempio:

Codice: Seleziona tutto

comando_che_può_fallire || true
ti consente di evitare il fallimento di tutto lo script se hai usato set -e.
Il fatto è tutti i comandi finiscono bene, e la funzione viene portata a termine, poi lo script esce.
Nel caso particolare in cui l'ho provato eseguiva l'elif, con $CUE vuota, quindi l'ultimo comando eseguito era flac, che terminava bene. Forse è quel test che disturbava il set -e? O forse l'else?
Ora continuando lo script ho dovuto aggiungere un comando prima del fi e dunque il problema non si presenta più, comunque la faccenda per me non è per niente chiara.
Non ho tempo altrimenti indagherei meglio.
Intanto grazie mille a tutti e due!

Re: BASH: script dal comportamento misterioso

Inviato: ven 12 ago 2011, 21:59
da 414N
anycolouryoulike ha scritto: Il fatto è tutti i comandi finiscono bene, e la funzione viene portata a termine, poi lo script esce.
Nel caso particolare in cui l'ho provato eseguiva l'elif, con $CUE vuota, quindi l'ultimo comando eseguito era flac, che terminava bene. Forse è quel test che disturbava il set -e? O forse l'else?
Prova ad eseguire lo script o tramite sh -x oppure specificando il parametro -x nello shebang iniziale (#!/bin/sh -x). In questo modo dovresti vedere qualche dettaglio in più.