Bagaimana latar belakang rantai perintah?

15

Saya ingin latar belakang seperti rantai perintah cp a b && mv b c && rm a.

Saya sudah mencoba melakukan cp a b && mv b c && rm a &tetapi ini hanya latar belakang proses terakhir.

Bagaimana cara latar belakang rantai perintah?

Cobra_Fast
sumber

Jawaban:

22

cp a b && mv b c && rm a &benar. &memiliki prioritas lebih rendah dari &&. Bahkan &memiliki prioritas lebih rendah dari apa pun selain ;dan baris baru: &berada dalam kategori sintaksis yang sama dengan ;, perbedaannya adalah yang ;menjalankan daftar perintah di latar depan sementara &menjalankannya di latar belakang. Anda dapat menguji ini sendiri:

$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited

Sama dengan pdksh, ksh93, bash, csh, tcsh.

Pengecualiannya adalah zsh, yang anehnya tidak kompatibel. Ini didokumentasikan dalam manual :

Jika sublist diakhiri oleh &, &|atau &!, shell mengeksekusi pipa terakhir di dalam latar belakang, dan tidak menunggu sampai selesai (perhatikan perbedaan dari kerang lain yang mengeksekusi seluruh sublist di latar belakang).

Sayangnya, zsh berperilaku seperti ini bahkan dalam mode kompatibilitas sh atau ksh. Untuk memastikan bahwa seluruh perintah dijalankan di latar belakang, letakkan tanda kurung atau tanda kurung di sekitarnya. Tanda kurung membuat subkulit sedangkan kurung kurawal tidak, tapi ini tidak relevan (kecuali sebagai optimasi mikro di beberapa shell) karena perintah latar belakang dalam subkulit pula.

{ cp a b && mv b c && rm a; } &
Gilles 'SO- berhenti menjadi jahat'
sumber
8
Di bawah bash , { ... ; } &lakukan fork pada level proses saat ini, sementara ( ... ) &lakukan fork dari subshell ... Hasilnya sama, tetapi tetap ada perbedaan yang halus.
F. Hauri
14

Anda bisa memasukkannya ke dalam parantheses (cp a b && mv b c && rm a )&untuk memasukkan seluruh rantai.

ulangan
sumber
2
Dan yang penting ini memperjelas bahwa seluruh rantai dilatar belakangi, bahkan kepada seseorang yang mungkin tidak tahu aturan tentang bagaimana operator dibatasi
jackweirdy
2
Lihatlah komentar saya pada jawaban @ Gilles, saya pikir { ... ; }ini adalah bentuk yang lebih baik.
F. Hauri