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?
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?
Jawaban:
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; } &
Anda bisa memasukkannya ke dalam parantheses (cp a b && mv b c && rm a )&
untuk memasukkan seluruh rantai.
{ ... ; }
ini adalah bentuk yang lebih baik.
{ ... ; } &
lakukan fork pada level proses saat ini, sementara( ... ) &
lakukan fork dari subshell ... Hasilnya sama, tetapi tetap ada perbedaan yang halus.