Ecco una possibile soluzione che non richiede bash. Immagina di avere due programmi thisworks
e thisfails
che falliscono o funzionano bene, rispettivamente. Quindi il seguente ti lascerà solo con work.gz
, eliminando fail.gz
, ad es. creare il target make gzipped se e solo se il programma eseguito correttamente:
all: fail.gz work.gz
work.gz:
(thisworks && touch [email protected]) | gzip -c -9 >[email protected]
rm [email protected] || rm [email protected]
fail.gz:
(thisfails && touch [email protected]) | gzip -c -9 >[email protected]
rm [email protected] || rm [email protected]
Spiegazione:
Nella prima riga della regola work.gz
, thisworks
uscirà con successo, e un file verrà creato work.gz.ok
, e tutto lo stdout passa attraverso gzip in work.gz
. Poi nella seconda riga, perché work.gz.ok
esiste, il primo comando rm
esce anche con successo - e dal momento che è ||
short-circuiting, il secondo rm
non viene eseguito e così work.gz
non viene eliminato.
OTOH, nella prima riga della regola fail.gz
, thisfails
uscirà con il fallimento, e fail.gz.ok
sarà non essere creato. Tutto lo stdout passa ancora attraverso gzip in fail.gz
. Poi nella seconda riga, perché fail.gz.ok
fa non esistono, i primi rm
comando termina con insufficienza, in modo ||
cerca il secondo comando rm
che cancella il file fail.gz
.
Per controllare facilmente che questo funziona come dovrebbe, è sufficiente sostituire thisworks
e thisfails
con i comandi true
e false
, rispettivamente, metterlo in un Makefile e digitare make
.
(Grazie alle persone gentili di #autotools per avermi aiutato con questo.)
Può spiegare questa risposta un po '? Non sono sicuro di capire bene cosa sta succedendo qui. – wheeler
certo, ho modificato la domanda - è stato d'aiuto? – unhammer