[Lugbz-list] shell problem: salvare il retval di un comando in mezzo ad una pipe
Thomas Pircher
tehpeh at gmx.net
Thu Feb 28 11:56:20 CET 2008
Ciao,
ho un problema di shell programming che non riesco a risolvere. Forse uno
di voi ha la soluzione.
Il problema e' il seguente:
Ho una pipeline di comandi, tipo "CC | SS" dove CC produce del output e SS
e' un filtro che riformatta l'output di CC. Io voglio eseguire la pipe e
salvarmi il valore di ritorno di CC.
Ho provato i seguenti comandi:
CC; retval=$? | SS
Questo non funziona perche' la pipe usa l'output di "retval=$?" e non di CC.
(CC; retval=$?) | SS
Adesso SS elabora l'output di CC, ma la variabile retval non e' definita
al di fuori delle parentesi, perche' le parentesi lanciano una sub-shell e
non so come esportare variabili da li'.
Background del problema:
Ho un Makefile che deve fermarsi al primo errore. Pero' io devo
riformattare l'output di $(CC). La regola di Make e' a grandi linee la
seguente:
%.o: %.c
$(CC) -c $(CFLAGS) -o $@ $< 2>&1 | sed -e 's/ome/thing/'
Essendo sed l'ultimo programma nella pipe, la shell ritorna il retvalue di
sed che e' sempre 0. Quindi make continua a compilare anche se c'e' un
errore.
Non posso fare la ridirezione del output in un file e poi riformattarlo,
perche' lo scopo di questo esercizio e' di avere un output 'cliccable' in
una IDE. Quindi non posso fermarmi subito quando $(CC) ritorna errore.
L'unica soluzione che ho trovato e' la seguente, ma e' veramente
inefficiente:
%.o: %.c
retval=0
$(CC) -c $(CFLAGS) -o $@ $< > /tmp/file 2>&1 || retval=1
sed -e 's/ome/thing/' /tmp/file
[ $$retval -eq 0 ]
Qualcuno ha un idea come potrei risolvere questo in meno righe di codice?
Ciao,
Thomas
More information about the Lugbz-list
mailing list