Uitvoeren combineer meerdere Linux-commando’s op één regel

Ik probeer meerdere linux-commando’s in één regel samen te voegen om de implementatiebewerking uit te voeren.
Bijvoorbeeld

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

Antwoord 1, autoriteit 100%

Als je elke opdracht alleen wilt uitvoeren als de vorige is gelukt, combineer ze dan met de operator &&:

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

Als een van de commando’s mislukt, worden alle andere commando’s die erop volgen niet uitgevoerd.

Als je alle commando’s wilt uitvoeren, ongeacht of de vorige zijn mislukt of niet, scheid ze dan met puntkomma’s:

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

In jouw geval denk ik dat je het eerste geval wilt waarin de uitvoering van de volgende opdracht afhangt van het succes van de vorige.

Je kunt ook alle commando’s in een script plaatsen en dat in plaats daarvan uitvoeren:

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

De backslashes aan het einde van de regel zijn er om te voorkomen dat de shell denkt dat de volgende regel een nieuw commando is; als je de backslashes weglaat, zou je het hele commando op één regel moeten schrijven.

Een handiger manier vergeleken met het gebruik van backslashes en &&overal is om de shell te instrueren om het script af te sluiten als een van de commando’s mislukt. U doet dat met behulp van de ingebouwde functie setmet het argument -e. Daarmee kun je op een veel natuurlijkere manier een script schrijven:

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

Sla dat op in een bestand, bijvoorbeeld myscript, en maak het uitvoerbaar:

chmod +x myscript

Je kunt dat script nu net als andere programma’s op de machine uitvoeren. Maar als u het niet in een map plaatst die wordt vermeld in uw omgevingsvariabele PATH(bijvoorbeeld /usr/local/bin, of op sommige Linux-distributies ~/bin), dan moet je het pad naar dat script specificeren. Als het in de huidige map staat, voer je het uit met:

./myscript

De opdrachten in het script werken op dezelfde manier als de opdrachten in het eerste voorbeeld; de volgende opdracht wordt alleen uitgevoerd als de vorige is geslaagd. Voor onvoorwaardelijke uitvoering van alle commando’s, bel gewoon niet set -e:

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

Antwoord 2, autoriteit 6%

Ik heb ontdekt dat het gebruik van ; om commando’s te scheiden werkt alleen op de voorgrond. bv :

cmd1; cmd2; cmd3 &– zal cmd3alleen op de achtergrond uitvoeren, terwijl
cmd1 && cmd2 && cmd3 &– zal de hele keten op de achtergrond uitvoeren ALS er geen fouten zijn.

Om onvoorwaardelijke uitvoering mogelijk te maken, lost het gebruik van haakjes dit op:

(cmd1; cmd2; cmd3) &– voert de reeks opdrachten op de achtergrond uit, zelfs als een stap mislukt.


Antwoord 3

U kunt uw commando’s scheiden met een puntkomma:

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

Was dat wat je bedoelde?


Antwoord 4

Om ze allemaal tegelijk uit te voeren, kunt u de pijplijntoets “|” gebruiken zoals zo:

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

Antwoord 5

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

Antwoord 6

Als u alle opdrachten wilt uitvoeren, of de vorige nu wel of niet wordt uitgevoerd, kunt u een puntkomma (;) gebruiken om de opdrachten te scheiden.

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

Als u de volgende opdracht alleen wilt uitvoeren als de vorige opdracht slaagt, kunt u && om de opdrachten te scheiden.

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

In jouw geval lijkt de uitvoering van opeenvolgende commando’s af te hangen van de vorige commando’s, dus gebruik het tweede voorbeeld, d.w.z. gebruik && om deel te nemen aan de opdrachten.


Antwoord 7

Wat is het nut van slechts één Ampersand?
Vanmorgen heb ik een launcher gemaakt in het XFCE-paneel (in Manjaro+XFCE) om tegelijkertijd 2 wachtwoordmanagers te starten:

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

Maar het werkt niet zoals ik wil. D.w.z. de eerste app start, maar de tweede start pas als de vorige is gesloten

Ik ontdekte echter dat (met slechts één ampersand):

sh -c "keepassx & password-gorilla"

en het werkt nu zoals ik wil…


Antwoord 8

  1. Gebruik ;
  • Het maakt niet uit of het eerste commando cmd1 succesvol is uitgevoerd of niet, voer altijd het tweede commando cmd2 uit:
    • $ cd myfolder; ls # no matter cd to myfolder successfully, run ls
    • . uit

  1. Gebruik &&
  • Alleen wanneer het eerste commando cmd1 succesvol is uitgevoerd, voer je het tweede commando cmd2 uit:

    • $ cd myfolder && ls # run ls only after cd to myfolder
  1. Gebruik ||
  • Alleen als de eerste opdracht cmd1 niet kon worden uitgevoerd, voer je de tweede opdracht cmd2 uit:

    • $ cd myfolder || ls # if failed cd to myfolder, `ls` will run

Antwoord 9

U kunt de volgende code gebruiken;

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

Het werkt…


Antwoord 10

Ik vind veel antwoorden op dit soort vragen misleidend

Aangepast vanuit dit bericht:
https://www.webmasterworld.com/linux/3613813.htm

De volgende code maakt een bash-venster en werkt precies als een bash-venster. Ik hoop dat dit helpt. Er zijn te veel foute/niet-werkende antwoorden…

           Process proc;
            try {
                //create a bash window
                proc = Runtime.getRuntime().exec("/bin/bash");
                if (proc != null) {
                       BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
                       PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())), true);
                       BufferedReader err = new BufferedReader(new InputStreamReader(
                       proc.getErrorStream()));
                       //input into the bash window
                       out.println("cd /my_folder");
                       out.println("rm *.jar");
                       out.println("svn co path to repo");
                       out.println("mvn compile package install");
                       out.println("exit");
                       String line;
                        System.out.println("----printing output-----");
                          while ((line = in.readLine()) != null) {
                             System.out.println(line);
                          }
                          while((line = err.readLine()) != null) {
                             //read errors
                          }
                          proc.waitFor();
                          in.close();
                          out.close();
                          err.close();
                          proc.destroy();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Antwoord 11

Ter info,
als u meerdere opdrachten in één regel in if-else wilt uitvoeren, kunt u de opdrachten tussen haakjes groeperen. Zie deze paginavoor meer details.

Je kunt de puntkomma (;) vervangen door &&of ||, afhankelijk van wat je nodig hebt. Houd er rekening mee dat haakjes een sub-shell maken om de opdrachten uit te voeren.

Het volgende commando voert de commando’s cmd1, cmd2 en cmd3 uit als er een bestand met de naam bestandsnaambestaat; anders cmd4, cmd5 en cmd6.

[ -f file_name ] && (cmd1; cmd2; cmd3) || (cmd4; cmd5; cmd6)

Other episodes