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?
()
untuk mengelilingi perintah.Jawaban:
Bagaimana tepatnya Anda ingin mereka menjalankannya? Jika Anda ingin mereka dimulai di latar belakang dan berjalan secara berurutan , Anda akan melakukan sesuatu seperti ini:
Sebaliknya, jika Anda ingin mereka berjalan secara paralel di latar belakang, Anda bisa melakukan ini:
Dan kedua teknik tersebut dapat digabungkan, seperti:
Bash menjadi bash, sering ada banyak teknik berbeda untuk menyelesaikan tugas yang sama, meskipun kadang-kadang dengan perbedaan halus di antara mereka.
sumber
sleep 2 && sleep 3 &
? Saya mencobanya dalam bash dan tampaknya bekerja dengan cara yang sama (dicoba dengan gema).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.Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.
di manual bash.Anda perlu menambahkan beberapa parens di versi terakhir Anda -
atau ini juga berfungsi -
sumber
&
, status keluarnya selalu nol. Jadi, kedua case di atas melakukan hal yang sama (Shell mengeksekusi kedua sisi secara serempak ).untuk menjalankan beberapa perintah latar belakang, Anda harus menambahkan
&
akhir dari setiap perintah. ex:(command1 &) && (command2 &) && (command3 &)
sumber
Jawaban di atas menggunakan tanda kurung. Bash juga dapat menggunakan kawat gigi untuk tujuan yang sama:
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.sumber
{ sleep 2; sleep 3; } &
?Ini bekerja:
Anda juga dapat melakukan:
sumber
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.sumber
Anda dapat menggunakan substitusi perintah bash
$(command)
seperti ini: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
bash
perintah untuk menelurkan proses baru yang akan menangani eksekusi.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/null
sebelum&
pada akhir perintah untuk mengarahkan ulang setidaknya stdout dan menghindari output pada stdout dari proses induk. Sesuatu seperti:sumber
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:
Oke, sekarang kita berada di langkah terakhir. Untuk menjalankan perintah di latar belakang (secara berurutan), jalankan saja:
sumber