Jawaban:
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 PATH
variabel 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
ls >/dev/null & ; echo $!
memicu kesalahan.
tail -f my.log & && ./myscript
yang tidak berfungsi .. tolong sarankan.
{ tail -f my.log & } && ./myscript
Namun, 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
sudo
izin untuk menjalankan salah satu perintah? Haruskah saya meletakkannya sudo
di awal semua perintah atau hanya di salah satu yang membutuhkannya? Bagaimana saya bisa meneruskan kata sandi ke perintah itu sehingga dieksekusi dengan baik?
Saya telah menemukan bahwa menggunakan; untuk memisahkan perintah hanya berfungsi di latar depan. misalnya:
cmd1; cmd2; cmd3 &
- hanya akan mengeksekusi cmd3
di 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.
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
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.
cd /my_folder && rm *.jar && svn co path to repo && mvn compile package install
cmd1 || cmd2
pemisah jika Anda hanya perlu cmd2
mengeksekusi jika cmd1
mengembalikan status bukan nol ke shell, dan Anda dapat menggunakan cmd1 ; cmd2
jika Anda ingin menjalankan kedua perintah terlepas dari status pengembaliannya.
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 ...
;
, kecuali bahwa ini menempatkan comman sebelum di latar belakang, yaitu shell tidak akan melihat hasilnya.
Anda dapat menggunakan kode berikut;
cd /my_folder && \
rm *.jar && \
svn co path to repo && \
mvn compile package install
Berhasil...
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();
}
||
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.