Repository 32bit  Forum
Repository 64bit  Wiki

[BASH] catturare "errori"

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] catturare "errori"

Messaggioda conraid » gio giu 03, 2010 19:40

come faccio a far eseguire un comando se lo script genera un errore?

mi spiego

mettiamo che ho questo

Codice: Seleziona tutto
set -e
#backup
mv file file2

...

#restore
mv file2 file


come posso far sì che restore venga sempre eseguito in caso di errore?

per adesso l'unica cosa che mi è venuta in mente è metterlo dopo un || nel make, tipo
se lo metto prima e dopo make, così va bene?

Codice: Seleziona tutto
#backup
mv file file2
restore(){
#restore
mv file2 file
}
make || restore


ma c'è un modo per far eseguire sempre un certo codice al momento dell'errore?

lo script è uno slackbuild
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [BASH]

Messaggioda JohnnyMnemonic » gio giu 03, 2010 19:52

Non ho la soluzione, ma forse qui potrai trovare qualcosa http://fvue.nl/wiki/Bash:_Error_handling
Avatar utente
JohnnyMnemonic
Staff
Staff
 
Messaggi: 2732
Iscritto il: sab set 04, 2004 23:00
Località: Bologna
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos

Re: [BASH]

Messaggioda conraid » gio giu 03, 2010 20:22

con trap sembra andare, grazie
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: [BASH]

Messaggioda metrofox » gio giu 03, 2010 20:27

Si potrebbe comunque fare in modo che, visto che ogni errore ha comunque un suo numero, di fare una funzione contenente tutti if, e tramite questi if vengono richiamate le funzioni che insomma sviluppano il programma a secondo di ciò che si vuole fare... Ad esempio

Codice: Seleziona tutto
if_func(){
if [ "$ERR" == "0" ]; then
 echo "I quit"
elif [ "$ERR" == "1" ]; then
 func2;
elif [ "$ERR" == "69" ]; then
 echo "Right position"
  69_func;
fi
}

mv file1 file2 || if_func


Quindi secondo me va più che bene di mettere "||" dopo il comando...
Avatar utente
metrofox
Linux 2.6
Linux 2.6
 
Messaggi: 758
Iscritto il: gio ago 07, 2008 11:29
Slackware: slackware64-current
Kernel: 3.4.4-ck3
Desktop: FluxBox-1.3.1
Distribuzione: FreeBSD-8.1(amd64)

Re: [BASH]

Messaggioda targzeta » gio giu 03, 2010 23:51

@metrofox
Ma come gli setti la variabile ERR? O mi sono perso qualcosa?

Comunque, l'esecuzione di uno script generalmente non termina se un comando è andato male, nel caso specifico termina perchè è stato specificato il comando 'set -e'. Quindi dal man della bash:
Codice: Seleziona tutto
set
...
-e      Exit  immediately  if  a simple command (see SHELL GRAMMAR above) exits with a non-zero status.
        The shell does not exit if the command that fails is part of the command list immediately following
        a while or until keyword, part of the test in an if statement, part of a  &&  or  || list, or if the
        command's return value is being inverted via !.  A trap on ERR, if set, is executed before the shell exits.
In pratica dice che generalmente lo script viene interrotto, però se si sta eseguendo un costrutto nel quale si potrebbe gestire l'errore, allora non fa niente. Quindi anche la soluzione iniziale può andar bene, saputo questo uno può valutare caso per caso cosa fare.

Io la trap la uso spesso per catturare il SIGTERM negli script che generano file temporanei in modo che in ogni caso mi assicuro di eliminare questi file prima di terminare l'esecuzione.

Emanuele
Linux Registered User #454438
Se pensi di essere troppo piccolo per fare la differenza, prova a dormire con una zanzara -- Dalai Lama
20/04/2013 - Io volevo Rodotà
Avatar utente
targzeta
Iper Master
Iper Master
 
Messaggi: 6186
Iscritto il: gio nov 03, 2005 14:05
Località: Carpignano Sal. (LE) <-> Pisa
Nome Cognome: Emanuele Tomasi
Slackware: current
Kernel: latest stable
Desktop: IceWM

Re: [BASH]

Messaggioda zxzxasas » ven giu 04, 2010 0:40

Giusto per curiosità...se fai eseguire lo slackbuild come funzione e ne controlli l' exit status? non dovrebbe essere diverso da zero se ha fatto errore e uguale a zero altrimenti?
zxzxasas
Linux 2.4
Linux 2.4
 
Messaggi: 397
Iscritto il: sab nov 15, 2008 2:28
Nome Cognome: Pasquale
Slackware: current
Kernel: 2.6.35.7
Desktop: KDE 4.5.2

Re: [BASH]

Messaggioda conraid » ven giu 04, 2010 10:06

spina ha scritto:Io la trap la uso spesso per catturare il SIGTERM negli script che generano file temporanei in modo che in ogni caso mi assicuro di eliminare questi file prima di terminare l'esecuzione.


è in pratica quel che devo fare

vedi
postfix non compila più sulla 13.1, perché mysql ha adesso un include con lo stesso nome di un file di postfix.
Devo quindi rinominare un include di mysql prima di compilare e poi ripristinarlo

Posso benissimo fare con la soluzione "make || restore", ma a questo punto mi piaceva trovare una soluzione più generale, in modo che in casi analoghi, ma in cui devo fare la stessa cosa per più comandi non debba fare tanti ||

e trap sembra la cosa giusta, all'uscita (per errore o per fine script) esegue la funzione indicata

per esempio
Codice: Seleziona tutto
restore_mysql(){
mv files.old files.h
}
trap restore_mysql EXIT


però ammetto che tutto è frutto di una lettura veloce ieri e di alcune prove

ho visto che questo prende anche il caso in cui faccio ctrl+c durante il make, anche se ho visto che ci sarebbero altre "uscite" da poter catturare, come INT e TERM
Avatar utente
conraid
Staff
Staff
 
Messaggi: 12022
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current


Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite