Repository 32bit  Forum
Repository 64bit  Wiki

BASH: script dal comportamento misterioso

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata e la versione del Kernel. Questi dati aiutano le persone che possono rispondere.
2) Specificare sempre il tipo di shell (bash, sh, csh, etc...)
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 dell'ultima regola porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 16:00

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 ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 16:21

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 ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 16:44

Facendo ulteriori prove, ho appurato che basta un qualsiasi comando dopo il "fi", per non far terminare male la funzione. :-k
Avatar utente
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggioda 414N » ven ago 12, 2011 17:37

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
414N
Iper Master
Iper Master
 
Messaggi: 2844
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE

Re: BASH: script dal comportamento misterioso

Messaggioda Blallo » ven ago 12, 2011 17:38

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
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3054
Iscritto il: ven ott 12, 2007 11:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14 x64 / 12.2
Kernel: 3.2.x
Desktop: Xfce

Re: BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 19:35

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
anycolouryoulike
Packager
Packager
 
Messaggi: 1158
Iscritto il: ven ago 10, 2007 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Re: BASH: script dal comportamento misterioso

Messaggioda 414N » ven ago 12, 2011 21:59

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ù.
Avatar utente
414N
Iper Master
Iper Master
 
Messaggi: 2844
Iscritto il: mer feb 13, 2008 17:19
Località: Bulagna
Slackware: 14.0 (x64)
Kernel: 3.2.29
Desktop: LXDE


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti