Kişi tek bir komutla arka planda birden fazla programı nasıl çalıştırabilir?


36

Kişi tek bir komutla arka planda birden fazla programı nasıl çalıştırabilir?

Aşağıdaki komutları denedim ama işe yaramadı.

nohup ./script1.sh & && nohup ./script2.sh &
-bash: syntax error near unexpected token '&&'

nohup ./script1.sh & ; nohup ./script2.sh &
-bash: syntax error near unexpected token ';'

tek bir "komut" nedir? Bir çizgi bash?
Oluf Lorenzen


Açıkça belli olan bir şeyi kaçırmış olabilirim, ancak önceki komutun çıkış kodunu bildiğim anlamına gelir. Arkaplanı yaparsanız, çıkış kodu bilinmeyecektir. Buradaki işlevsel ihtiyaç neydi?
Richlv

Yanıtlar:


32

Kabuk sözdizimi bakış açısından, / / ... &gibi komutları ayırır (elbette farklı anlamsal olsalar bile). Yani sadece:;|&&

cmd1 & cmd2 & cmd3 &

1
bu / quite / right değil, bir ;sonraki komutu birincisi biter bitmez başlatır. &aslında komutu arkaplana koyar. sadece şunu deneyin:echo foo & echo bar & echo test &
Oluf Lorenzen

1
Tabii @Finkregh. Bundan kimsenin şüphesi yok. Sadece her ikisinin de ayrı komutları (bir sözdizimi bakış açısıyla) nasıl çalıştırıldıkları konusunda bir etkisi olmadan kastettim.
Stéphane Chazelas

Sorusu tam olarak sorulmadı, çünkü soru bir "tek komut" vermeyi belirtti. Çok komutların bir dizi, ama birleştirilmiş olması çıktıda tek komutla anlamsal en az birine sahiptir olarak ne cevabım vardır vs. yönlendirilebilir
Eli Heady

"Tek komutla çoklu komut", oxymoron gibi görünüyor, ancak bu ne anlama geliyor? Bu, bunun gibi bir sudoşeyse şifreyi yalnızca bir kez girebilir, sonra sarabilir bash -cveya benzer şekilde kullanabilirsiniz.
Richlv

12

Bileşik Komutları başlıklı bash manpage bölümünde çalışacak iki seçenek, liste ve grup komutları bulunur.

Bir grup komutu, küme parantezi içine alınmış bir dizi komuttur {}. Bir liste parantez içine alınmış, aynıdır (). Her ikisi de, içerideki çoklu komutları arka planlamak ve son olarak da tüm koleksiyonu küme olarak arka planlamak için kullanılabilir. Liste yapısı, alt kabuktaki komutları çalıştırır, böylece değişken atamaları korunmaz.

Bir grup komut çalıştırmak için:

{ command1 & command2 & } &

Komutlarınızı bir listede de (alt kabuk) çalıştırabilirsiniz:

( command1 & command2 ) &

1
Rica ederim. Bağlantıyı kılavuza ekledim. Liste ()sözdiziminin ekteki komutları bir alt kabukta yürüttüğünü, dolayısıyla değişkenlerin içinde korunmadığını unutmayın.
Eli Heady

3

diğer yol:

$(command1 &) && command2 & 

Hayır, önce ilk komutu çalıştıracak, sonra ilk önce bitirdikten sonra başka bir komutu çalıştıracak
Rahul Patil

Eğer kullanılan &&bunu düşünmüyoruz sonraki command.if çalıştırın başarıyla çalıştırırsanız sorunuzu, bu çalıştırabilir, daha sonra ilk çalıştırıldığı anda bir komut gelircommand1 & ; command2 & ;
Basra Körfezi

ilk komut başarılı bir şekilde bg'ye girdi veya ;bununla ilgili bir sorunla
kaçmadı
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.