Bir komut zincirini arka planlamak istiyorum cp a b && mv b c && rm a
.
Yapmayı denedim cp a b && mv b c && rm a &
ama bu sadece son sürecin arka planı.
Bir komut zincirini nasıl arka plana ekleyebilirim?
Bir komut zincirini arka planlamak istiyorum cp a b && mv b c && rm a
.
Yapmayı denedim cp a b && mv b c && rm a &
ama bu sadece son sürecin arka planı.
Bir komut zincirini nasıl arka plana ekleyebilirim?
Yanıtlar:
cp a b && mv b c && rm a &
doğru. &
önceliği daha düşüktür &&
. Aslında ve newline &
dışındaki herhangi bir önceliğe göre daha düşük önceliğe sahiptir ;
: fark , komut listesini arka planda çalıştırırken ön planda çalıştıran ve &
sözdizimsel kategoridedir . Bunu kendiniz test edebilirsiniz:;
;
&
$ dash -c 'sleep 2 && echo waited & echo backgrounded'
backgrounded
$ waited
Pdksh, ksh93, bash, csh, tcsh ile aynı.
İstisna, tuhaf bir şekilde uyumsuz olan zsh'dir. Bu kılavuzda belgelenmiştir :
Alt listesini bir tarafından feshedilirse
&
,&|
veya&!
, kabuk arka planda o son boru hattını çalıştırır ve bitirmek (arka planda bütün alt listesini yürütmek diğer kabuklarından farka dikkat) için beklemez.
Ne yazık ki, zsh sh veya ksh uyumluluk modunda bile bu şekilde davranır. Komutun tamamının arka planda yürütüldüğünden emin olmak için, etrafına parantez veya parantez koyun. Parantezler bir alt kabuk oluşturur, ancak diş telleri yapmaz, ancak arka plandaki bir komut yine de alt kabukta olduğu için bu önemsizdir (bazı kabuklarda mikro optimizasyon hariç).
{ cp a b && mv b c && rm a; } &
(cp a b && mv b c && rm a )&
tüm zinciri dahil etmek için parantez içine koyabilirsiniz .
{ ... ; }
tercih edilebilir bir form (yol).
{ ... ; } &
mevcut işlem düzeyinde( ... ) &
çatal yapın, alt kabuktan çatal yapın ... Sonuç aynı, ancak yine de ince bir fark var.