Birden çok arka plan komutunu bash'da tek bir satırda nasıl çalıştırabilirim?


169

Normalde böyle bir şey ile birden fazla komut çalıştırın:

sleep 2 && sleep 3

veya

sleep 2 ; sleep 3

ama ikisini de arka planda bir komut satırı komutundan çalıştırmak istersem ne olur?

sleep 2 & && sleep 3 &

çalışmıyor. Ve ne yerini vermez &&ile;

Bunu yapmanın bir yolu var mı?


8
Kullan ()komutunu çevrelemek için.
Ocak'ta nhahtdh

Yanıtlar:


319

Onların nasıl kaçmasını istersiniz? Bunların arka planda başlatılmasını ve sıralı olarak çalışmasını istiyorsanız, şöyle bir şey yaparsınız:

(sleep 2; sleep 3) &

Öte yandan, arka planda paralel olarak koşmalarını istiyorsanız, bunu yapabilirsiniz:

sleep 2 & sleep 3 &

Ve iki teknik birleştirilebilir, örneğin:

(sleep 2; echo first finished) & (sleep 3; echo second finished) &

Bash bash olmakla birlikte, bazen aralarında ince farklar olsa da, aynı görevi gerçekleştirmek için birçok farklı teknik vardır.


20
Bu, "bir insana balık tutmayı öğreten" kısa ve iyi düşünülmüş bir cevaptır. Teşekkürler.
Mart'ta ambrus

2
Yaparsak ne olur sleep 2 && sleep 3 &? Ben bash denedim ve aynı şekilde çalışıyor gibi görünüyor (yankı ile çalıştı).
Wajahat

@HakanBaba, Evet, gerçekten arka planda bir alt kabuk yaratıyor.
Douwe van der Leest

3
@Wajahat, denedin sleep 2 && echo "foo" && sleep 3 & echo "bar""mi? &&Operatör kendinden önceki komutu yürütmek için kabuk söyler ve sadece herhangi bir hata olmadan bu komut yürütür kabuk sonraki komutu yürütür. Bu esasen farklıdır ;, çünkü ;ölümcül bir hata olmadıkça sonraki komutun önceki komutun çıkış durumundan bağımsız olarak çalışmasına izin verir. &Arka planda, "bağlı" komutların hepsini önceki çalıştırmak için kabuk söyler. Burada "bağlı", komutun bir pipe ( |) veya mantıksal bir operatörün parçası olduğu anlamına gelir .
Douwe van der Leest

Of these list operators, ‘&&’ and ‘||’ have equal precedence, followed by ‘;’ and ‘&’, which have equal precedence.bash kılavuzunda.
jinbeom hong

49

Son sürümünüze bazı ortaklar eklemeniz gerekiyor -

(sleep 2 &) && (sleep 3 &)

veya bu da işe yarıyor -

(sleep 2 &) ; (sleep 3 &)

Not: Bir liste ile kullanıldığında &çıkış durumu her zaman sıfırdır. Yani, yukarıdaki iki durum aynı şeyi yapar (Kabuk her iki tarafı da eşzamansız olarak yürütür ).
jinbeom hong

9

birden fazla arka plan komutu çalıştırmak için &her komutun sonuna eklemeniz gerekir . örn: (command1 &) && (command2 &) && (command3 &)


5

Yukarıdaki cevaplar parantez kullanır. Bash ayrıca benzer bir amaçla parantez kullanabilir:

{ sleep 2 && sleep 3; } &

Parantezlerin sözdizimi konusunda daha seçici olduğunu unutmayın - sonraki boşluk {, önceki boşluk }ve son noktalı virgül gereklidir. Bazı durumlarda, diş telleri daha verimlidir çünkü yeni bir alt kabuğu çatallamazlar. Bu durumda fark yaratıp yaratmadığını bilmiyorum.


1
Ne olmuş { sleep 2; sleep 3; } &?
Kenny Evitt

4

Bu çalışıyor:

$(sleep 2 &) && sleep 3 &

Ayrıca şunları yapabilirsiniz:

$(sleep 2 && sleep 3) &

0

Ben de aynı göreve sahibim. Denedim (sleep2 ; fg )& sleep3 ; fg, çalışıyor. Ve ctrl + c ikiye katlandığınızda, iki işlem durdurulabilir.


0

Bash komutu değiştirmesini şu şekilde kullanabilirsiniz $(command):

$(command1 ; command2) &

Stdin ve stdout'un hala üst sürece bağlı olduğunu ve en azından stdout'un yeniden yönlendirilmesinin zor olabileceğini unutmayın. Böylece alternatif olarak komutları tek bir satırda zincirleyebilir, ardından bashyürütmeyi işleyecek yeni bir işlem oluşturmak için dizeyi komuta iletebilirsiniz .

bash -c "command1 ; command2" & 

Bu, özellikle arka planda birden fazla komut çalıştırmanız gerektiğinde bash betiğinde kullanışlıdır.

Bu iki ifade eşdeğer olmalıdır. Bir darbe işlem komutu (komutların zincir) ve işlemek için her iki durumda da yumurtlamaya edilir& ve sonunda yürütme işlemi ayrılır.

Bu kez, en azından stdout'u yeniden yönlendirmek ve üst işlemin stdout'undaki çıktıdan kaçınmak için komutun sonuna &>/dev/nullönce ekleyebilirsiniz &. Gibi bir şey:

bash -c "command1 ; command2" &>/dev/null &

-1

Birden fazla komutu sırayla çalıştırmak istiyorsanız , her yerde çalışan gerçekten basit bir yöntem vardır: Dosya oluşturma! Bu yöntemin yararı temiz ve basit olmasıdır.

Öncelikle dosyanızı bir adla oluşturun, örn commands.sh. Ardından, komutlarınızı oraya koyun. İşte bir örnek:

commands.sh:

#!/system/bin/sh

sleep 3;
sleep 2;

Tamam, şimdi son adımdayız. Komutları arka planda (sırayla) çalıştırmak için şunu çalıştırın:

$ sh commands.sh &
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.