Repository 32bit  Forum
Repository 64bit  Wiki

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.

BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 15: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: gio ago 09, 2007 23: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 15: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: gio ago 09, 2007 23: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 15: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: gio ago 09, 2007 23: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 16: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: 2881
Iscritto il: mer feb 13, 2008 16: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 16: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: 3222
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: BASH: script dal comportamento misterioso

Messaggioda anycolouryoulike » ven ago 12, 2011 18: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: gio ago 09, 2007 23: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 20: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: 2881
Iscritto il: mer feb 13, 2008 16: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

cron