Bagaimana cara menjalankan beberapa perintah latar belakang dalam bash dalam satu baris?

169

Saya biasanya menjalankan beberapa perintah dengan sesuatu seperti ini:

sleep 2 && sleep 3

atau

sleep 2 ; sleep 3

tetapi bagaimana jika saya ingin menjalankan keduanya di latar belakang dari satu perintah baris perintah?

sleep 2 & && sleep 3 &

tidak bekerja Dan juga tidak mengganti &&dengan;

Apakah ada cara untuk melakukannya?

Istana Chan
sumber
8
Gunakan ()untuk mengelilingi perintah.
nhahtdh
1
unix.stackexchange.com/questions/67006/…
Ciro Santilli 郝海东 冠状 病 六四 六四 事件 法轮功

Jawaban:

319

Bagaimana tepatnya Anda ingin mereka menjalankannya? Jika Anda ingin mereka dimulai di latar belakang dan berjalan secara berurutan , Anda akan melakukan sesuatu seperti ini:

(sleep 2; sleep 3) &

Sebaliknya, jika Anda ingin mereka berjalan secara paralel di latar belakang, Anda bisa melakukan ini:

sleep 2 & sleep 3 &

Dan kedua teknik tersebut dapat digabungkan, seperti:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

Bash menjadi bash, sering ada banyak teknik berbeda untuk menyelesaikan tugas yang sama, meskipun kadang-kadang dengan perbedaan halus di antara mereka.

Kitsune
sumber
20
Ini adalah jawaban singkat dan dipikirkan dengan matang yang "mengajarkan manusia untuk menangkap ikan" seumur hidup. Terima kasih.
ambrus
2
Apa yang terjadi jika kita melakukannya sleep 2 && sleep 3 &? Saya mencobanya dalam bash dan tampaknya bekerja dengan cara yang sama (dicoba dengan gema).
Wajahat
@HakanBaba, Ya itu memang membuat subkulit di latar belakang.
Douwe van der Leest
3
@Wajahat, Sudahkah Anda mencoba sleep 2 && echo "foo" && sleep 3 & echo "bar""? The &&Operator memberitahu shell untuk menjalankan perintah sebelum, dan hanya jika yang mengeksekusi perintah tanpa kesalahan shell mengeksekusi perintah selanjutnya. Ini pada dasarnya berbeda dari ;, karena ;memungkinkan perintah berikutnya mengeksekusi terlepas dari status keluar dari perintah sebelumnya kecuali itu adalah kesalahan fatal. Ia &memberi tahu shell untuk menjalankan semua perintah "terhubung" sebelumnya, di latar belakang. "terhubung" di sini berarti perintah adalah bagian dari pipa ( |) atau operator logis.
Douwe van der Leest
Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.di manual bash.
jinbeom hong
49

Anda perlu menambahkan beberapa parens di versi terakhir Anda -

(sleep 2 &) && (sleep 3 &)

atau ini juga berfungsi -

(sleep 2 &) ; (sleep 3 &)
iagreen
sumber
Catatan: Saat daftar digunakan &, status keluarnya selalu nol. Jadi, kedua case di atas melakukan hal yang sama (Shell mengeksekusi kedua sisi secara serempak ).
jinbeom hong
9

untuk menjalankan beberapa perintah latar belakang, Anda harus menambahkan &akhir dari setiap perintah. ex: (command1 &) && (command2 &) && (command3 &)

berkata
sumber
5

Jawaban di atas menggunakan tanda kurung. Bash juga dapat menggunakan kawat gigi untuk tujuan yang sama:

{ sleep 2 && sleep 3; } &

Perhatikan bahwa kawat gigi lebih pilih-pilih tentang sintaksis - spasi setelah {, spasi sebelumnya} , dan titik koma akhir diperlukan. Dalam beberapa situasi kawat gigi lebih efisien karena mereka tidak membayar subkulit baru. Dalam hal ini saya tidak tahu apakah itu membuat perbedaan.

Greg Reagle
sumber
1
Bagaimana dengan { sleep 2; sleep 3; } &?
Kenny Evitt
4

Ini bekerja:

$(sleep 2 &) && sleep 3 &

Anda juga dapat melakukan:

$(sleep 2 && sleep 3) &
higuaro
sumber
0

Saya memiliki misi yang sama juga. Saya sudah mencoba (sleep2 ; fg )& sleep3 ; fg, ini berhasil. Dan ketika Anda preass ctrl + c dua kali lipat, kedua proses itu bisa dihentikan.

dingyang wang
sumber
0

Anda dapat menggunakan substitusi perintah bash $(command)seperti ini:

$(command1 ; command2) &

Perhatikan bahwa stdin dan stdout masih ditautkan ke proses induk dan mengarahkan ulang setidaknya stdout bisa rumit. Jadi, sebagai alternatif, Anda dapat mengaitkan perintah dalam satu baris kemudian meneruskan string ke bashperintah untuk menelurkan proses baru yang akan menangani eksekusi.

bash -c "command1 ; command2" & 

Ini sangat berguna dalam skrip bash ketika Anda perlu menjalankan banyak perintah di latar belakang.

Kedua pernyataan ini harus setara. Sebuah pesta proses bertelur dalam kedua kasus untuk menangani perintah (rantai perintah) dan& di akhir melepaskan eksekusi.

Kali ini Anda dapat menambahkan &>/dev/nullsebelum &pada akhir perintah untuk mengarahkan ulang setidaknya stdout dan menghindari output pada stdout dari proses induk. Sesuatu seperti:

bash -c "command1 ; command2" &>/dev/null &
Bemipefe
sumber
-1

Jika Anda ingin menjalankan beberapa perintah secara berurutan , ada metode yang sangat sederhana yang bekerja di mana-mana: Membuat file! Manfaat dari metode ini adalah bersih dan sederhana.

Pertama, buat file Anda dengan nama, mis commands.sh. Lalu, letakkan perintah Anda di sana. Berikut adalah contohnya:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

Oke, sekarang kita berada di langkah terakhir. Untuk menjalankan perintah di latar belakang (secara berurutan), jalankan saja:

$ sh commands.sh &
MAChitgarha
sumber