356 Stimmen

Ausführen mehrerer Linux-Befehle in einer Zeile kombinieren

Ich versuche, mehrere Linux-Befehle in einer Zeile zusammenzufassen, um einen Bereitstellungsvorgang durchzuführen. Zum Beispiel

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

771voto

Nikos C. Punkte 48846

Wenn Sie jeden Befehl nur dann ausführen wollen, wenn der vorherige erfolgreich war, dann kombinieren Sie sie mit der Option && Betreiber:

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

Wenn einer der Befehle fehlschlägt, werden alle anderen Befehle, die ihm folgen, nicht ausgeführt.

Wenn Sie alle Befehle ausführen wollen, unabhängig davon, ob die vorherigen Befehle fehlgeschlagen sind oder nicht, trennen Sie sie durch Semikolon:

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

In Ihrem Fall, denke ich, wollen Sie den ersten Fall, in dem die Ausführung des nächsten Befehls vom Erfolg des vorherigen abhängt.

Sie können auch alle Befehle in einem Skript zusammenfassen und dieses stattdessen ausführen:

#! /bin/sh

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

Die Backslashes am Ende der Zeile sollen verhindern, dass die Shell die nächste Zeile für einen neuen Befehl hält; würden Sie die Backslashes weglassen, müssten Sie den gesamten Befehl in eine einzige Zeile schreiben.

Ein bequemerer Weg im Vergleich zur Verwendung von Backslashes und && soll die Shell anweisen, das Skript zu beenden, wenn einer der Befehle fehlschlägt. Sie tun dies mit der set integrierte Funktion mit der -e Argument. Damit können Sie ein Skript auf eine viel natürlichere Weise schreiben:

#! /bin/sh
set -e

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

Speichern Sie das in einer Datei, zum Beispiel myscript und machen es ausführbar:

chmod +x myscript

Sie können das Skript nun wie andere Programme auf dem Rechner ausführen. Wenn Sie es jedoch nicht in einem Verzeichnis ablegen, das in Ihrem PATH Umgebungsvariable (zum Beispiel /usr/local/bin oder bei einigen Linux-Distributionen ~/bin ), dann müssen Sie den Pfad zu diesem Skript angeben. Wenn es sich im aktuellen Verzeichnis befindet, führen Sie es mit aus:

./myscript

Die Befehle im Skript funktionieren genauso wie die Befehle im ersten Beispiel; der nächste Befehl wird nur ausgeführt, wenn der vorherige erfolgreich war. Um alle Befehle bedingungslos auszuführen, rufen Sie einfach nicht set -e :

#! /bin/sh

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

50voto

Dean Punkte 491

Ich habe festgestellt, dass die Verwendung von ; zur Trennung von Befehlen nur im Vordergrund funktioniert. z.B. :

cmd1; cmd2; cmd3 & - wird nur ausgeführt cmd3 im Hintergrund, während cmd1 && cmd2 && cmd3 & - wird die gesamte Kette im Hintergrund ausgeführt, WENN keine Fehler auftreten.

Um eine unbedingte Ausführung zu ermöglichen, wird dieses Problem durch die Verwendung von Klammern gelöst:

(cmd1; cmd2; cmd3) & - führt die Befehlskette im Hintergrund aus, auch wenn ein Schritt fehlschlägt.

10voto

andrux Punkte 2752

Sie können Ihre Befehle durch einen Doppelpunkt trennen:

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

War es das, was Sie meinten?

2voto

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

2voto

Kelly Poore Punkte 70

Um sie alle auf einmal auszuführen, können Sie die Pipe-Line-Taste "|" wie folgt verwenden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X