Jalankan menggabungkan beberapa perintah Linux dalam satu baris


329

Saya mencoba untuk menggabungkan beberapa perintah linux dalam satu baris untuk melakukan operasi penyebaran. Sebagai contoh

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

Jawaban:


717

Jika Anda ingin menjalankan setiap perintah hanya jika yang sebelumnya berhasil, maka gabungkan mereka menggunakan &&operator:

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

Jika salah satu perintah gagal, maka semua perintah lain yang mengikutinya tidak akan dieksekusi.

Jika Anda ingin menjalankan semua perintah terlepas dari apakah yang sebelumnya gagal atau tidak, pisahkan dengan koma:

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

Dalam kasus Anda, saya pikir Anda ingin kasus pertama di mana pelaksanaan perintah selanjutnya tergantung pada keberhasilan yang sebelumnya.

Anda juga dapat menempatkan semua perintah dalam skrip dan menjalankannya sebagai gantinya:

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

(Garis miring terbalik di akhir baris ada untuk mencegah shell dari berpikir bahwa baris berikutnya adalah perintah baru; jika Anda menghilangkan garis miring terbalik, Anda perlu menulis seluruh perintah dalam satu baris.)

Simpan itu ke file, misalnya myscript, dan buat itu dapat dieksekusi:

chmod +x myscript

Anda sekarang dapat menjalankan skrip itu seperti program lain di mesin. Tetapi jika Anda tidak menempatkannya di dalam direktori yang tercantum dalam PATHvariabel lingkungan Anda (misalnya /usr/local/bin, atau pada beberapa distribusi Linux ~/bin), maka Anda perlu menentukan path ke skrip itu. Jika ada di direktori saat ini, Anda menjalankannya dengan:

./myscript

Perintah dalam skrip bekerja dengan cara yang sama seperti perintah pada contoh pertama; perintah selanjutnya hanya dijalankan jika yang sebelumnya berhasil. Untuk eksekusi tanpa syarat semua perintah, cukup daftarkan setiap perintah pada barisnya sendiri:

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

38
Untuk pembaca mendatang: Anda juga dapat menggunakan ||alih-alih titik koma atau &&jika Anda hanya ingin perintah berikutnya dijalankan jika yang terakhir gagal. Seperti dalam coba ini, dan jika gagal, coba itu.
DeVadder

3
Hm, titik koma tidak selalu berhasil. Misalnya ls >/dev/null & ; echo $!memicu kesalahan.
Hi-Angel

1
Dan bagaimana jika saya ingin menjalankan perintah pertama di latar belakang dan yang lain di latar depan .. Saya mencoba ini tail -f my.log & && ./myscriptyang tidak berfungsi .. tolong sarankan.
OverrockSTAR

4
@ Pareshkumar Dengan bash, Anda dapat melakukan: { tail -f my.log & } && ./myscriptNamun, perhatikan bahwa &&tidak ada gunanya di sini, karena pekerjaan pertama berjalan di latar belakang dan dengan demikian pekerjaan kedua tidak dapat mengetahui hasilnya, karena kedua pekerjaan akan dimulai pada saat yang sama. Jadi, Anda sebaiknya menulis:{ tail -f my.log & }; ./myscript
Nikos C.

Bagaimana jika saya memerlukan sudoizin untuk menjalankan salah satu perintah? Haruskah saya meletakkannya sudodi awal semua perintah atau hanya di salah satu yang membutuhkannya? Bagaimana saya bisa meneruskan kata sandi ke perintah itu sehingga dieksekusi dengan baik?
Drubio

46

Saya telah menemukan bahwa menggunakan; untuk memisahkan perintah hanya berfungsi di latar depan. misalnya:

cmd1; cmd2; cmd3 & - hanya akan mengeksekusi cmd3di latar belakang, sedangkan cmd1 && cmd2 && cmd3 &- akan mengeksekusi seluruh rantai di latar belakang JIKA tidak ada kesalahan.

Untuk memenuhi eksekusi tanpa syarat, menggunakan kurung memecahkan ini:

(cmd1; cmd2; cmd3) & - akan menjalankan rantai perintah di latar belakang, meskipun langkah apa pun gagal.


1
Apakah trailing ampersand (&) dalam contoh Anda disengaja? Jika demikian, untuk apa ini?
Technophile

5
@ Technophile Ini untuk menjalankan perintah latar belakang
Oak Chantosa

1
Satu jawaban sederhana, pendek dan langsung, Anda harus lebih sering menggunakan situs web StackExchange Dean. Terima kasih atas masukan Anda.
CPHPython

10

Anda dapat memisahkan perintah Anda menggunakan titik koma:

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

Apakah itu yang kamu maksud?


3

Untuk menjalankan semuanya sekaligus, Anda dapat menggunakan kunci garis pipa "|" seperti itu:

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

1
Pipeline sedang digunakan untuk memberikan output dari perintah Anda ke perintah berikutnya sebagai input. Sebagai contoh: X | Y -> output perintah X akan berfungsi sebagai input untuk perintah Y
Arpan Saini

2

Jika Anda ingin menjalankan semua perintah, apakah yang sebelumnya dijalankan atau tidak, Anda dapat menggunakan titik koma (;) untuk memisahkan perintah.

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

Jika Anda ingin menjalankan perintah berikutnya hanya jika perintah sebelumnya berhasil, maka Anda dapat menggunakan && untuk memisahkan perintah.

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

Dalam kasus Anda, eksekusi perintah berurutan tampaknya bergantung pada perintah sebelumnya, jadi gunakan contoh kedua yaitu gunakan && untuk bergabung dengan perintah.


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

itu tidak sama dengan skrip OP, tolong jelaskan: jika perintah gagal, skrip dibatalkan
Gilles Quenot

4
Selain itu, Anda dapat menggunakan cmd1 || cmd2pemisah jika Anda hanya perlu cmd2mengeksekusi jika cmd1mengembalikan status bukan nol ke shell, dan Anda dapat menggunakan cmd1 ; cmd2jika Anda ingin menjalankan kedua perintah terlepas dari status pengembaliannya.
Victor Sorokin

@sputnick Seharusnya, saya hanya menempelkannya dan menyatukan perintah dengan &&
Mark Stevens

3
@ Markarkevens Ini implementasi yang lebih baik tetapi tidak akan mendapatkan hasil yang sama seperti jika perintah dijalankan secara berurutan, saya pikir itulah yang dimaksud sputnick.
andrux

1

Apa kegunaan satu Ampersand saja? Pagi ini, saya membuat peluncur di panel XFCE (di Manjaro + XFCE) untuk meluncurkan 2 pengelola kata sandi secara bersamaan:

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

Tetapi itu tidak bekerja seperti yang saya inginkan. IE, aplikasi pertama dimulai tetapi yang kedua dimulai hanya ketika sebelumnya ditutup

Namun, saya menemukan itu (dengan hanya satu ampersand):

sh -c "keepassx & password-gorilla"

dan itu berfungsi seperti yang saya inginkan sekarang ...


1
Ampersand bertindak sebagai terminator perintah yang mirip dengan ;, kecuali bahwa ini menempatkan comman sebelum di latar belakang, yaitu shell tidak akan melihat hasilnya.
Sergiy Kolodyazhnyy

-1

Anda dapat menggunakan kode berikut;

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

Berhasil...


-1

Saya menemukan banyak jawaban untuk pertanyaan semacam ini menyesatkan

Diubah dari pos ini: https://www.webmasterworld.com/linux/3613813.htm

Kode berikut akan membuat jendela bash dan berfungsi persis seperti jendela bash. Semoga ini membantu. Terlalu banyak jawaban salah / tidak berfungsi di luar sana ...

            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();
            }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.