Newsgroup: it.comp.os.linux.iniziare
Titolo: bash: visualizzare tutti gli exit code

echo $? #solo l'ultimo
 
ma se volessi visualizzarli tutti?
Tutti quelli generati ad esempio durante l'esecuzione di un file bash, 
con rispettivi numeri di riga (in cui si è verificato l'errore)?
Si può avere  una sorta di tracking completo?


L'exit code è uno.
Altrimenti sarebbe il tornoFraUnAttimoMaPoiForseEscoDiNuovo code
 
Credo ti interessi questo
http://stackoverflow.com/questions/16080716/execute-multiple-commands-in-a-bash-script-sequentially-and-fail-if-at-least-one
 
 
Se cerchi una stack-trace in Bash non c'è che io sappia, devi armarti di 
pazienza e fartela
http://wiki.bash-hackers.org/commands/builtin/caller#simple_stack_trace
 
 
-- 
I fatti mi cosano

 Si puï¿œ avere  una sorta di tracking completo?
 
Che problema stai cercando di risolvere?
 
Magari esiste una soluzione alternativa...
 
bye,
 
-- 
 
piergiorgio

On 2013-05-29 18:41, one4all wrote:

Che problema stai cercando di risolvere?
 
Magari esiste un metodo alternativo...
 
bye,
 
-- 
 
piergiorgio

 Magari esiste un metodo alternativo...
 
Avere la conferma che tutti i comaandi di un file bash, siano stati 
eseguiti con successo, senza fare la verifica punto per punto:
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
comando
if [ $? -ne 0 ]; then
	read -p "Attenzione si è verificato un errore"
fi
 
Vi sembra un sistema efficiente?


Facebook: Massimo Bacilieri

 Vi sembra un sistema efficiente?
 
Posta il tuo problema non la tua soluzione
 

 Vi sembra un sistema efficiente?
 
Scritta cosi` mi sembra una cosa inutile, il tuo
program flow deve essere eseguito in modo da essere
robusto agli errori ed eventualmente riportarli.
 
Non serve riportare errori per ogni comando, serve
controllare i punti critici.
 
Per esempio, se uno script ha bisogno di 3 parametri,
allora si controlla che vi siano 3 parametri ed, in
caso contrario, si esce con errore ed help.
 
Ma se un comando (programma) dello script ha un
problema, sara` lui stesso a riportarlo.
 
Per esempio:
 
#!/bin/bash
cat file_che_non_esiste
echo ciao
 
Se eseguito ritorna:
 
cat: file_che_non_esiste: No such file or directory
ciao
 
E` importante controllare esplicitamente "cat"?
Dipende, ma in questo specifico script direi di no.
E` importante controllare "echo", sicuramente no.
 
Controlla anche l'uso di "eval", che magari aiuta.
 
bye,
 
-- 
 
piergiorgio


 
Ho un file bash di inizializzazione che fa di tutto:
 
- installa software
- crea directory
- aggiorna
- prepara alcune cose
- richiama altri file bash
ecc.
 
Dopo averlo eseguito, come faccio ad essere sicuro che il tutto sia 
stato fatto correttamente, senza errori?
Se ci sono stati, gli errori, saranno passati velocemente sullo schermo 
e sfuggiti dalla mia vista.
Non c'è un modo affinchè, in caso d'errore, l'esecuzione si interrompa?

 Non c'è un modo affinchè, in caso d'errore, l'esecuzione si interrompa?
 
Già ti hanno risposto.
 
man bash  /trap
 
 

 fi
 
Se non ti interessa sapere quale comando abbia fallito puoi 
incrementare ogni volta un contatore in caso di fallimento. Se alla 
fine è diverso da 0 allora c'è stato un errore.
 
 


E se per errore banale, incremento la variabile sbagliata?
Ad ogni modo bisogna sempre scrivere delle noiose e monotone piccole 
porzioni di codice.

 porzioni di codice.
 
Sempre e comunque in ogni situazione, se
vuoi controllare ogni riga di codice.
 
In C, ogni "printf()" ritorna il numero di
caratteri stampato, ovvero -1 (credo) in
caso di errore.
 
Devo controllare ogni "printf()" per "< 0"?
Posso farlo, ovviamente, ma il codice diventa
un po' pesante. Anche se fosse automatico.
 
Ad ogni modo, come gia` scritto, ogni programma
dello shell script ritorna errori a modo suoi,
per cui, quanto meno, li vedi a terminale o sul
file di log.
 
bye,
 
-- 
 
piergiorgio

 porzioni di codice.
 
Il codice è così, non si scrive quasi mai da solo. Probabilmente stai 
usando lo strumento sbagliato per il compito.


cmq procedendo il mio lavoro certi problemi si stanno risolvendo da 
soli, alla fine effettivamente i controlli servono solo in alcuni punti 
chiave ;.b


E' una porcata ma io lo uso spesso:
 
LOGFILE=/tmp/log
 
error(){
   echo "ERROR: check logfile: $LOGFILE"
   exit 1
}
 
Poi i vari comandi li metti come:
 
comando >> $LOGFILE 2>> $LOGFILE || error
 

 eseguiti con successo, senza fare la verifica punto per punto:
 
  Per il debug c'è l'opzione errexit (set -o errexit o set -e), magari
usato in combinazione con set -o xtrace o -x.  Ti fa scoprire le
istruzioni che terminano con un exit code non nullo non esplicitamente
catturato, ma poi fa terminare lo script. Se non vuoi che lo script
esegua qualcosa di speciale prima di uscire, potresti trappare il
segnale 0 (EXIT).  Ad esempio:
 
#!/bin/bash
set -e errexit
set -o xtrace
trap "echo 'Segnare 0 (EXIT) trappato'" 0
echo ciao ciao
echo ecco un comando che non provoca errori:
sleep 1
ls /tmp
echo ecco invece un comando che provoca errori:
sleep 1
ls /non_c-r_directory
echo fine di giochi
 
 
 
  Dalla pagina man bash(1):
 
      -e      Esce immediatamente se  un  comando  semplice  (si  veda
              GRAMMATICA  DELLA  SHELL  sopra)  termina  con uno stato
              diverso da zero.  La shell non esce se  il  comando  che
              non  ha  successo  fa  parte di un elenco di comandi che
              segue subito dopo una parola chiave while o until  ,  se
              fa  parte  di  un  controllo in un'istruzione if , se fa
              parte di una lista && o ⎪⎪ , o se il valore  di  ritorno
              del  comando  è stato negato per mezzo di !.  Un comando
              sul segnale intercettato ERR, se impostato,  è  eseguito
              prima dell'uscita della shell.
 
      -x      Dopo l'espansione di ogni comando semplice, comando for,
              comando case, comando select o comando  for  aritmetico,
              mostra  il  valore espanso di PS4, seguito dal comando e
              dai suoi  argomenti  espansi  o  dall'elenco  di  parole
              associate.
 
 
  Ciao,
 
 
-- 
Alessandro Selli 
http://alessandro.route-add.net
 
AVVERTENZA: i messaggi inviati a "trappola" non mi arriveranno.
WARNING: messages sent to "trappola" will never reach me.

 eseguiti con successo, senza fare la verifica punto per punto:
 
  Per il debug c'è l'opzione errexit (set -o errexit o set -e), magari
usato in combinazione con set -o xtrace o -x.  Ti fa scoprire le
istruzioni che terminano con un exit code non nullo non esplicitamente
catturato, ma poi fa terminare lo script. Se vuoi che lo script
