BASH: script dal comportamento misterioso

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

BASH: script dal comportamento misterioso

Messaggio 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

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggio da anycolouryoulike »

Togliendo il set -e in effetti prosegue...
Ma quegli echo che ruolo avrebbero nel non far terminare lo script col set -e?

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggio da anycolouryoulike »

Facendo ulteriori prove, ho appurato che basta un qualsiasi comando dopo il "fi", per non far terminare male la funzione. :-k

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: BASH: script dal comportamento misterioso

Messaggio 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.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: BASH: script dal comportamento misterioso

Messaggio 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

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggio 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!

Avatar utente
414N
Iper Master
Iper Master
Messaggi: 2922
Iscritto il: mer 13 feb 2008, 16:19
Slackware: 15.0
Kernel: 5.15.19
Desktop: KDE5
Località: Bulagna
Contatta:

Re: BASH: script dal comportamento misterioso

Messaggio 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ù.

Rispondi