L'esecuzione di Diversi Comandi Bash, Basato su Java Versione
Domanda
Sto cercando di sviluppare un bash script di build per un progetto Java che verrà eseguito su Ubuntu e Fedora.Ubuntu utilizza il compilatore gcj mentre Fedora usa IcedTea.
Sia il loro rapporto di errori e warning in modi leggermente diversi, e voglio ignorare gli avvertimenti (lo so, non è generalmente una buona idea, ma alcuni avvisi sono semplicemente idiota).
Per gcj, voglio correre:
javac *.java 2>&1 | grep -A 4 "error:"
ma per IcedTea, voglio correre:
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
Sono ancora nuovo a bash, quindi come faccio a scrivere un'istruzione if che sarebbe uno contro l'altro in base al javac versione?
Soluzione
Assumendo che il java e javac binari partita, e che IcedTea è il caso speciale.
#!/bin/bash
ERROR="error:"
java -version 2>&1 | grep -i icedtea > /dev/null
if [ $? -eq 0 ]; then
ERROR="error:\|errors\|.java:"
fi
javac *.java 2>&1 | grep -A 4 $ERROR
Sul mio sistema, IcedTea e il sole hanno la stessa uscita per "javac -version", ma non per "java -version".
Altri suggerimenti
La scrittura di Java script in bash (o qualsiasi altro linguaggio di shell) ha una serie di problemi:
script tendono ad essere non-portatili a causa della shell differenze, le diverse posizioni di comando, comando incompatibili opzioni e così via ...anche se si tenta di rendere il portatile.
script non è possibile far fronte con le dipendenze (o almeno non facilmente)
gli script non possono far fronte con ricompilare solo roba che ha cambiato
Invece, suggerisco di scrivere un "build.xml" file e utilizzare il Ant tool di build.La formica ha il vantaggio di funzionare su qualsiasi versione della piattaforma che esegue Java, e di prendersi cura della maggior parte delle differenze di piattaforma.È come una sorta di meglio "Fare", progettato specificamente per la costruzione di Java.
#!/bin/sh
JAVAC_VERSION="`java -version 2>&1 /dev/null | awk '/IcedTea/ {print $4}' | sed -e 's/[\(0-9]//g'`"
ICEDTEA="IcedTea"
if [ ${JAVAC_VERSION} = ${ICEDTEA} ]; then
javac *.java 2>&1 | grep -A 4 "error:\|errors\|.java:"
else
javac *.java 2>&1 | grep -A 4 "error:"
fi
exit 0
Che dovrebbe farlo - se ho capito bene la tua domanda. Come si ottiene la versione -. Im non del tutto sicuro di, ma se il mio javac -version
è corretto basta cambiare di conseguenza alle proprie esigenze