Pagina 1 di 1
[BASH] catturare "errori"
Inviato: gio 3 giu 2010, 20:40
da conraid
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
Re: [BASH]
Inviato: gio 3 giu 2010, 20:52
da JohnnyMnemonic
Non ho la soluzione, ma forse qui potrai trovare qualcosa
http://fvue.nl/wiki/Bash:_Error_handling
Re: [BASH]
Inviato: gio 3 giu 2010, 21:22
da conraid
con trap sembra andare, grazie
Re: [BASH]
Inviato: gio 3 giu 2010, 21:27
da metrofox
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...
Re: [BASH]
Inviato: ven 4 giu 2010, 0:51
da targzeta
@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
Re: [BASH]
Inviato: ven 4 giu 2010, 1:40
da zxzxasas
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?
Re: [BASH]
Inviato: ven 4 giu 2010, 11:06
da conraid
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