Bir şekilde zaten çalışan bir prog1'e “&& prog2” ekleyebilir miyim?


87

En kabukları gibi fonksiyonlar sağlar &&ve ;belirli şekillerde komutların yürütülmesi zinciri ile ilgilidir. Fakat eğer bir komut zaten çalışıyorsa, birincisinin sonucuna bağlı olarak yürütülecek başka bir komutu yine de ekleyebilir miyim?

Koştuğumu söyle

$ /bin/myprog
some output...

ama gerçekten istedim /bin/myprog && /usr/bin/mycleanup. Her myprogşeyi öldürüp yeniden başlatamam çünkü çok fazla zaman kaybedilecek. Ben yapabilirsiniz Ctrl+ Zonu ve fg/ bggerekirse. Bu, başka bir komutla zincirlememe izin veriyor mu?

Çoğunlukla bash ile ilgileniyorum, ancak tüm genel kabuklara cevaplar açıktır!

Yanıtlar:


118

Bunu, waitkomutta bulunduğunuzla aynı kabukta yapabilmeniz gerekir :

$ sleep 30 &
[1] 17440

$ wait 17440 && echo hi

...30 seconds later...
[1]+  Done                    sleep 30
hi

Bash adam sayfasından alıntı

wait [n ...]
     Wait for each specified process and return its termination status. Each n 
     may be a process ID or a job specification; if a job spec is given,  all 
     processes  in that job's pipeline are waited for.  If n is not given, all 
     currently active child processes are waited for, and the return status is 
     zero.  If n specifies a non-existent process or job, the return status is 
     127.  Otherwise, the return status is the exit status of the last process 
     or job waited for.

Komutta beklemek işi yapmalı.
BillThor

Orada gibi arka plana sürecin PID girmek için kısa form bir dizi %, %1ve $!. PID'yi vermek önemlidir, yoksa ikinci komut her zaman çalışacaktır.
BillThor

@BillThor - Sadece cevabı nitelendiriyor musunuz veya bana bunu mu söylüyorsunuz?
slm

Cevabı niteliyorum. Bir düz waitistenen sonucu sağlamak için başarısız olur. Kısa formları, yazım hatalarına daha az eğilimli oldukları için kullanmak yaygındır.
BillThor

2
Beni ilk yeni
rozetinle

63

fgsürdürdüğü programdan çıkış kodu ile döner. Bu nedenle, programınızı askıya alabilir ^Zve fg && ...devam ettirmek için kullanabilirsiniz .

$ /bin/myprog
some output...
^Z
[1]+ Stopped              /bin/myprog
$ fg && /usr/bin/mycleanup

sona ermeden tekrar askıya alınır ve farklı bir komutla aynı şeyi yaparsanız, temizlemenin ilk zinciri değiştirilir mi?
Burhan Ali,

3
@BurhanAli myprogİkinci kez askıya alınması, fgsıfır olmayan çıkış koduyla (20) sonlanmasına neden olur , bu nedenle zincirleme mycleanupkomut çalıştırılmaz.
n.

1

İstediğiniz şeyin mümkün olup olmadığından emin değilsiniz ancak programı başlattığınız kabuğa hala sahipseniz, $?en son işlemin çıkış durumunu her zaman kontrol edebilirsiniz :

$ /bin/myprog
some output...
$ if [ $? -ne 0 ];then echo "non-zero exit status";else echo "0 exit status";fi

1
Bu işe yarayacak, ancak daha sonra elle çalıştırması gerekecek, komut tamamlandığında bunu otomatik olarak çalıştırmak istiyor.
slm

@slm Anlaştık. Bu kesin problem için bir çözümüm yok.
Joseph R.

3
waitBash'deki komutu kontrol edin .
slm

1

İş ön planda ise, bu komutlardan herhangi biri beklediğiniz gibi aynı davranışa sahip olacaktır.

[ $? -eq 0 ] && prog2
(( $? )) || prog2

NOT: $? Çıktığında çalışan programın dönüş durumunu içerecektir.

Bu, açıkça komutu girmiş olsaydınız kabuğun ne yapacağını açıkça belirtir.

prog1 && prog2

İlk komut önden okuma yapmıyorsa stdinve ön planda çalışıyorsa, ilk komut çalışırken yeni komut girilebilir. İlk komut çalıştırıldığında kabuk onu okuyacak ve yürütecektir. Komut arka planda çalışacaksa, okuyor olması muhtemel değildir stdin.

EDIT: İşi arka plana koymak ve WAITkomutu kullanmak da kullanılabilir. Arka planda başka işler de yapılmışsa, bu dikkatle yapılmalıdır. WAITKomutun beklediğiniz işin durumunu döndürmesi için bir iş spesifikasyonu gerekir .


Bu işe yarayacak, ancak daha sonra elle çalıştırması gerekecek, komut tamamlandığında bunu otomatik olarak çalıştırmak istiyor.
slm

4
@slm Komut stdin okumadığı sürece, ilk komut çalışırken yeni komut girilebilir. İlk komut yapıldığı anda kabuk onu okuyacaktır.
BillThor

Kabukta arka plandan çıktıktan sonra bir şey yaparsa büyük olasılıkla hortumlanır. En azından prelim göre. test şimdiye kadar yapıyorum!
slm

2
@BillThor Bu yorumu cevabınıza eklemeniz gerektiğini düşünüyorum.
Joseph R.

2
Evet, kullanmak waitda ideal değil. Avantaj, IMO, bize karşı karşıya olduğumuz daha net bir API vermesidir. Bir şey çalıştıktan sonra komut satırına daha fazla komut yazmak bana biraz tehlikeli geldi. waithala çalışan PID ile doğrudan bağlantı kurmakta sıkıntı çekmiyor, dönüş durumu wrt. Bu, Bash'in işleri nasıl yürüttüğü konusunda daha fazla bir sorun gibi görünüyor: stackoverflow.com/questions/356100/… . Yani bu olabildiğince iyi olabilir.
slm
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.