2012-10-25 18 views

risposta

515

Se si desidera eseguire ogni comando solo se il precedente è riuscito, poi combinarle utilizzando l'operatore di &&:

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

Se uno dei comandi non riesce, allora tutti gli altri comandi seguendolo non sarà eseguito.

Se si desidera eseguire tutti i comandi indipendentemente dal fatto che i precedenti non sono riusciti o meno, separarli con un punto e virgola:

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

Nel tuo caso, penso che si desidera che il primo caso in cui l'esecuzione del comando successivo dipende dal successo del precedente.

si può anche mettere tutti i comandi in uno script ed eseguire che invece:

#! /bin/sh 
cd /my_folder \ 
&& rm *.jar \ 
&& svn co path to repo \ 
&& mvn compile package install 

(I backslash alla fine della linea è quello di evitare che la shell pensare che la riga successiva è un nuovo comando ; se si omette il backslash, si avrebbe bisogno di scrivere l'intero comando in una sola riga)

Salva che in un file, ad esempio myscript, e renderlo eseguibile:

chmod +x myscript 
.

Ora è possibile eseguire quello script come altri programmi sulla macchina. Ma se non lo si inserisce in una directory elencata nella variabile di ambiente PATH (ad esempio /usr/local/bin o su alcune distribuzioni Linux ~/bin), sarà necessario specificare il percorso di tale script. Se è nella directory corrente, lo si esegue con:

./myscript 

I comandi nello script funzionano allo stesso modo dei comandi nel primo esempio; il comando successivo viene eseguito solo se il precedente è riuscito. Per l'esecuzione incondizionata di tutti i comandi, è sufficiente elencare ogni comando sulla propria riga:

#! /bin/sh 
cd /my_folder 
rm *.jar 
svn co path to repo 
mvn compile package install 
+8

+1 per una bella risposta. –

+2

+1. Questo è esattamente quello che stavo cercando! –

+21

Per i futuri lettori: Puoi anche usare '||' invece di punto e virgola o '&&' se vuoi che il comando successivo sia eseguito solo se l'ultimo non è riuscito. Come in questo, e se fallisce, provalo. – DeVadder

1
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 
+0

non è la stessa cosa dello script OP, per favore spiegate: se un comando di aa fallisce, lo script abortisce –

+3

Inoltre, è possibile usare 'cmd1 || cmd2' separator se hai bisogno di 'cmd2' per eseguire solo se' cmd1' ha restituito uno stato diverso da zero alla shell, e puoi usare 'cmd1; cmd2' se vuoi eseguire entrambi i comandi indipendentemente dal loro stato di ritorno. –

+0

@sputnick Dovrebbe essere, ho appena incollato e concatenato i comandi con && –

9

È possibile separare i comandi con un punto e virgola:

cd /my_folder;rm *.jar;svn co path to repo;mvn compile package install 

era quello che vuoi dire?

1

Se si desidera eseguire tutti i comandi, se il precedente esegue o no, è possibile utilizzare il punto e virgola (;) per separare il comandi.

cd /my_folder; rm *.jar; svn co path to repo; mvn compile package install 

Se si desidera eseguire il comando successivo solo se il comando precedente ha esito positivo, quindi è possibile utilizzare & & per separare i comandi.

cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install 

Nel tuo caso, l'esecuzione di comandi consecutivi sembra dipendere dai comandi precedenti, quindi usa il secondo esempio i.e. utilizzare & & per unire i comandi.

36

Ho trovato che l'utilizzo; per separare i comandi funziona solo in primo piano. ad esempio:

cmd1; cmd2; cmd3 & - eseguirà solo cmd3 in background, mentre cmd1 && cmd2 && cmd3 & - eseguirà l'intera catena in background se non ci sono errori.

per soddisfare per l'esecuzione incondizionata, utilizzando le parentesi risolve questo:

(cmd1; cmd2; cmd3) & - eseguirà la catena di comandi in background, anche se ogni passaggio non riesce.

+1

La e commerciale finale (&) nei tuoi esempi è stata intenzionale? Se sì, a cosa serve? – Technophile

+4

@Technophile È necessario eseguire un [comando background] (http://unix.stackexchange.com/questions/103731/run-a-command-without-making-me-wait) –

+0

Una risposta semplice, breve e diretta, tu utilizzare i siti Web StackExchange più spesso Dean. Grazie per il tuo contributo. – CPHPython

0

Qual è l'utilità di un unico e commerciale? Questa mattina, ho fatto un lanciatore nel pannello XFCE (in Manjaro + XFCE) per lanciare 2 password manager contemporaneamente:

sh -c "keepassx && password-gorilla" 
or 
sh -c "keepassx; password-gorilla" 

Ma non funziona come voglio. IE, le prime partenze app, ma la seconda si avvia solo quando la precedente è chiuso: -/

Tuttavia, ho scoperto che (con una sola e commerciale):

sh -c "keepassx & password-gorilla" 

e funziona come voglio ora. ..