Komut zincirini nasıl arka plana alabilirim?


15

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:


22

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; } &

8
Bash altında , { ... ; } &mevcut işlem düzeyinde ( ... ) &çatal yapın, alt kabuktan çatal yapın ... Sonuç aynı, ancak yine de ince bir fark var.
F. Hauri

14

(cp a b && mv b c && rm a )&tüm zinciri dahil etmek için parantez içine koyabilirsiniz .


2
Ve daha da önemlisi, tüm zincirin, operatörlerin nasıl
bağlandığının

2
@ Gilles'in cevabına yaptığım yoruma bakın, bence { ... ; }tercih edilebilir bir form (yol).
F. Hauri
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.