Bir komut satırında ve içinde olan birden fazla komutu nasıl çalıştırabilirim?


12

Baş ağrısı problemiyle karşılaştım.

Arka planda çoklu komutları yürütmek istiyorum, bu yüzden bunları tek tek bash'da başlatmak istiyorum. Linux kabuğunda bir komutu arka planda başlatmak kolaydır, tıpkı şöyle:

myCommand &

Aynı şekilde birden fazla komut başlatmak da kolaydır:

myCommand1 && myCommand2

veya

myCommand1 ; myCommand2

Ama arka planda birden fazla komut çalıştırmak istiyorsanız, aşağıdaki komut biçimini denedim, ancak başarısız oldu:

myCommand1 & && myCommand2 &

veya

myCommand1 & ; myCommand2 &

Her iki biçim de başarısız. &Bir komut satırında bulunan birden fazla komutu nasıl çalıştırabilirim ?


2
Onları bir senaryoya koyun ve senaryoyu arka planda çalıştırın
Panther



Panther, () kullanmak, bu sorunu bir komut dosyası kullanmaktan çok daha kolay düzeltmeye yardımcı olabilir. İstediğimiz şeyi kendimiz oluşturmak yerine, öncelikle kabuğun kendisi tarafından sağlanan özelliklerden tam olarak yararlanmaya çalışalım. Ancak elbette, komut dosyası kullanmak da bu sorunu çözebilir. Yine de teşekkürler.
Saat ZHONG

Bir 'tail -F <file1>> <file2>' ve ardından 'jobs -l', ardından '' -h% 1 ''
akskap 30:08

Yanıtlar:


24

() Kullanın.

Bunları sırayla çalıştırmak istiyorsanız:

(myCommand1; myCommand2) &

veya

(myCommand1 &) && (myCommand2 &)

Paralel çalışmalarını istiyorsanız:

myCommand1 & myCommand2 &

Bash'da bunu da kullanabilirsiniz ({ve; arkasındaki boşluk zorunludur):

{ myCommand1 && myCommand2; } &

3
(myCommand1 &) && (myCommand2 &)başarısız myCommand2olsa bile çalışır myCommand1.
terdon

() bash'ın & & && öğesini ayırt etmesine yardımcı olabilir. & & & & Togather'ı kullanmak istediğimizde yürütme birimini ayırmak için () kullanın.
Saat ZHONG

16

Sanırım bunu istiyorsun:

myCommand1 & myCommand2 &

Bu başlar myCommand1ve arkasından ve işareti geldiği için arka plana gönderir, hemen başlar myCommand2ve bunu arka plana da gönderir, böylece kabuğu tekrar serbest bırakır.

Listeler

Daha iyi anlaşılması için, yerine kullanabilir boru hattı ile komuta burada.

Liste, operatörlerden biri ile ayrılmış bir veya daha fazla boru hattının bir dizisidir ; , & , && veya || ve isteğe bağlı olarak şunlardan biri ile sonlandırılır ; , & , veya .

Bir komut, kontrol operatörü & tarafından sonlandırılırsa , kabuk, komutu bir alt kabukta arka planda yürütür. Kabuk, komutun bitmesini beklemez ve dönüş durumu 0'dır. Komutlar a ile ayrılmış ; sırayla yürütülür; mermi sırayla her komutun bitmesini bekler. Dönüş durumu, son çalıştırılan komutun çıkış durumudur.

AND ve OR listeleri, && ve || ile ayrılmış bir veya daha fazla boru hattının dizisidir. kontrol operatörleri.
Kaynak:man bash

Bunu örneklere ayıralım. Komutları birleştirip bunlardan biriyle ayırarak bir liste oluşturabilirsiniz ; & && ||:

command1 ; command2  # runs sequentially
command1 && command2 # runs sequentially, runs command2 only if command1 succeeds
command1 || command2 # runs sequentially, runs command2 only if command1 fails
command1 & command2  # runs simultaneously

Bunlardan biriyle listeleri kesebilirler: ; & <newline>.
Normalde Enter, eşit olan bir komut veya liste yürütürsünüz <newline>. Noktalı virgül ;özellikle komut dosyalarında aynı amaca hizmet eder. &Ancak ve işareti , kabukları derhal serbest bırakarak arka planda bir alt kabukta komut (lar) ı başlatır.

Daha fazla grup listesi için yuvarlak ()veya kıvırcık parantez {}kullanabilirsiniz, fark yuvarlak parantezlerin bir alt kabuk oluşturması ve kıvırcık parantezlerin olmamasıdır. Kıvırcık parantezlerin ilkinden sonra boşluk ve noktalı virgül veya kapanış parantezinden önce yeni satır gerekir. Örneğin:

# if c1 succeeds start a shell in the background
# and run c2 and c3 sequentially inside it
c1 && ( c2 ; c3 ) & 
# run c1 and if it succeeds c2 sequentially as a group command
# if c1 or c2 fail run c3 in the background
{ c1 && c2 ;} || c3 &

Bu, kullanımdan emin değilseniz trueve falseinşaatın beklendiği gibi çalışıp çalışmadığını test etmek için oldukça karmaşık olabilir :

$ { true && true ;} || echo 2
$ { true && false ;} || echo 2
2

İş Kontrolü

jobsKomut çalıştıran veya son zamanlarda şimdiki kabuğunda bitmiş olan arka plan işlerinin bir listesi. İş denetimi için birkaç klavye kısayolu ve komutu vardır:

  • Ctrl+ ön planda çalışmakta olan işlemin durdurulmasına neden Zolan askıya alma karakterini yazar, sonlandırılmaz, ancak jobslistede kalır
  • Ctrl+ , ön planda çalışmakta olan işlemin terminalden girişi okumaya çalıştığında durdurulmasına neden Yolan gecikmeli askıya alma karakterini yazar
  • fg= %gerekirse bir işlemi başlatarak ön plana getirir, işlemi aşağıdaki gibi belirtebilirsiniz:

     %       # last process in the jobs list
     %1      # 1st process in the jobs list
     %abc    # process beginning with the string “abc”
     %?abc   # process containing the string “abc” anywhere
  • bg= %&gerekirse bir işlemi arka planda başlatır:

     %&      # last process in the jobs list
     %1&     # 1st process in the jobs list
     %abc&   # process beginning with the string “abc”
     %?abc&  # process containing the string “abc” anywhere
  • wait bir arka plan işleminin tamamlanmasını bekler ve sonlandırma durumunu döndürür:

     wait %1 # 1st process in the jobs list

    Uzun bir işlem başlattığınızı ( jobs3 sayısını ortaya çıkardığını) ve daha sonra bilgisayarın tamamlandığında askıya alınmasını echove işlemin başarılı olamadığını bildiren bir mesaj aldığınızı hayal edin :

     wait %3 || echo failed ; systemctl suspend

Ama & & dikkatli olmak önemlidir komutun ne döndüğüne bağlıdır , bu yüzden biz ne dersek gerçekten bash bir şey döndürür emin olmalıyız gerçeğe uygun bir değer ..?
mathreadler

@mathreadler Kötü yapılmış bazı kullanıcı komut dosyalarından bahsetmedikçe çıkış değeri çok iyi tanımlanmış (bkz. man bash) ve tam olarak tasarlandığı gibi yaygın olarak kullanılıyor AFAIK - Hiç garip bir şey yaşamadım.
tatlı

tam olarak, kötü yapılmış kullanıcı komut dosyalarına dikkat edilmelidir. Varlar ve bu tür hataları bulmak için bir acı olabilirler. Askubuntu sana "tatlı" yapmama izin vermiyor.
mathreadler

Ah tamam, şimdi bahsettiğiniz mantıklı.
mathreadler
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.