Birden çok Linux komutunu bir satırda birleştirin


329

Dağıtım işlemini gerçekleştirmek için bir satırda birden çok linux komutunu birleştirmeye çalışıyorum. Örneğin

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

Yanıtlar:


717

Her komutu yalnızca bir öncekinin başarılı olması durumunda yürütmek istiyorsanız, &&operatörü kullanarak bunları birleştirin :

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

Komutlardan biri başarısız olursa, onu izleyen diğer tüm komutlar yürütülmez.

Önceki komutların başarısız olup olmamasına bakılmaksızın tüm komutları yürütmek istiyorsanız, bunları noktalı virgülle ayırın:

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

Sizin durumunuzda, bir sonraki komutun yürütülmesinin bir öncekinin başarısına bağlı olduğu ilk vakayı istediğinizi düşünüyorum.

Ayrıca tüm komutları bir komut dosyasına yerleştirebilir ve bunun yerine yürütebilirsiniz:

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

(Satırın sonundaki ters eğik çizgiler, kabuğun bir sonraki satırın yeni bir komut olduğunu düşünmesini önlemek için vardır; ters eğik çizgileri atlarsanız, tüm komutu tek bir satıra yazmanız gerekir.)

Örneğin myscript, bunu bir dosyaya kaydedin ve yürütülebilir yapın:

chmod +x myscript

Artık bu komut dosyasını makinedeki diğer programlar gibi yürütebilirsiniz. Ancak bunu PATHortam değişkeninizde listelenen bir dizinin içine yerleştirmezseniz (örneğin /usr/local/binveya bazı Linux dağıtımlarında ~/bin), o komut dosyasının yolunu belirtmeniz gerekir. Geçerli dizinde ise, aşağıdakilerle yürütürsünüz:

./myscript

Koddaki komutlar, ilk örnekteki komutlarla aynı şekilde çalışır; sonraki komut yalnızca bir öncekinin başarılı olması durumunda çalışır. Tüm komutların koşulsuz yürütülmesi için, her komutu kendi satırında listeleyin:

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

38
Gelecekteki okuyucular için: ||Noktalı virgül yerine veya &&yalnızca son komut başarısız olduğunda bir sonraki komutun yürütülmesini istiyorsanız da kullanabilirsiniz . Bunu deneyin ve başarısız olursa deneyin.
DeVadder

3
Hm, noktalı virgüller her zaman işe yaramaz. Örn, ls >/dev/null & ; echo $!bir hatayı tetikler.
Hi-Angel

1
Peki ya ilk komutu arka planda, diğeri ön planda çalıştırmak istersem .. tail -f my.log & && ./myscriptÇalışmayan bunu deniyorum .. lütfen öner.
OverrockSTAR

4
@Pareshkumar Bash ile şunları yapabilirsiniz: { tail -f my.log & } && ./myscriptAncak, &&ilk işin arka planda çalıştığı ve bu nedenle ikinci işin sonucunu bilemeyeceğinden, burada işe yaramaz olduğuna dikkat edin , çünkü her iki iş de aynı anda başlayacaktır. Yani sadece şunu da yazabilirsiniz:{ tail -f my.log & }; ./myscript
Nikos C.

sudoKomutlardan birini çalıştırmak için izinlere ihtiyacım olursa ne olur ? sudoTüm komutların başlangıcına mı yoksa sadece ihtiyacı olana mı koymalıyım ? Düzgün yürütülmesi için şifreyi bu komuta nasıl iletebilirim?
Drubio

46

Bunu kullanarak buldum; komutları ayırmak için yalnızca ön planda çalışır. Örneğin :

cmd1; cmd2; cmd3 & - yalnızca cmd3arka planda cmd1 && cmd2 && cmd3 &yürütülürken - hata yoksa EĞER zincirin tamamını arka planda yürütür.

Koşulsuz yürütmeye hitap etmek için parantez kullanmak bunu çözer:

(cmd1; cmd2; cmd3) & - herhangi bir adım başarısız olsa bile komut zincirini arka planda yürütür.


1
Örneklerinizdeki sondaki ve işareti (&) kasıtlı mıydı? Eğer öyleyse, ne için?
Technophile

5
@Technophile Bir arka plan komutu
Oak Chantosa

1
Basit, kısa ve doğrudan bir cevap, StackExchange web sitelerini daha sık kullanmalısınız Dean. Girdiniz için teşekkürler.
CPHPython

10

Komutlarınızı noktalı virgül kullanarak ayırabilirsiniz:

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

Demek istediğin bu muydu?


3

Hepsini birden çalıştırmak için "|" boru hattı anahtarını kullanabilirsiniz. şöyle:

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

1
Boru hattı, komutunuzun çıktısını bir sonraki komut olarak girdi olarak vermek için kullanılıyor. Örneğin: X | Y -> X komut çıkışı Y komutu için giriş olarak çalışır
Arpan Saini

2

Bir öncekinin yürütülüp yürütülmediğinden bağımsız olarak tüm komutları yürütmek istiyorsanız, komutları ayırmak için noktalı virgül (;) kullanabilirsiniz.

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

Bir sonraki komutu yalnızca önceki komut başarılı olduğunda yürütmek istiyorsanız, komutları ayırmak için && tuşlarını kullanabilirsiniz.

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

Sizin durumunuzda, ardışık komutların yürütülmesi önceki komutlara bağlı gibi görünüyor, bu nedenle ikinci örneği kullanın, yani komutlara katılmak için && kullanın.


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

OP komut dosyası ile aynı değildir, lütfen açıklayın: aa komutu başarısız olursa, komut dosyası iptal edilir
Gilles Quenot

4
Ek olarak, cmd1 || cmd2ayırıcıyı cmd2yalnızca cmd1kabuğa sıfır dışında bir durum döndürüldüğünde yürütmeniz gerekiyorsa ve cmd1 ; cmd2her iki komutu da dönüş durumlarından bağımsız olarak çalıştırmak istiyorsanız kullanabilirsiniz .
Victor Sorokin

@sputnick Olmalı, sadece yapıştırdım ve komutları && ile birleştirdim
Mark Stevens

3
@MarkStevens Daha iyi bir uygulama ancak komutlar sırayla çalıştırılmış gibi aynı sonuçlara ulaşmayacak, sanırım sputnick'in anlamı buydu.
andrux

1

Sadece bir Ampersand'ın faydası nedir? Bu sabah, aynı anda 2 şifre yöneticisi başlatmak için XFCE panelinde (Manjaro + XFCE'de) bir başlatıcı yaptım:

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

Ama istediğim gibi çalışmıyor. IE, ilk uygulama başlar, ancak ikinci uygulama yalnızca önceki kapalı olduğunda başlar

Ancak, buldum (sadece bir ve işareti ile):

sh -c "keepassx & password-gorilla"

ve şimdi istediğim gibi çalışıyor ...


1
Ve işareti komut komutanı gibi davranır ;, ancak bunun arkayı komutanın arkasına koyması gerekir, yani kabuk çıktısını görmez.
Sergiy Kolodyazhnyy

-1

Aşağıdaki kod olarak kullanabilirsiniz;

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

İşe yarıyor...


-1

Bu tür bir soru için yanıltıcı bir sürü cevap buluyorum

Bu yayından değiştirildi: https://www.webmasterworld.com/linux/3613813.htm

Aşağıdaki kod bash penceresi oluşturur ve tam olarak bash penceresi olarak çalışır. Bu yardımcı olur umarım. Orada çok fazla yanlış / çalışmıyor cevap var ...

            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();
            }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.