2012-02-22 17 views
10

Bir komut dosyasını yürüten kabuğun adını almaya çalışıyorum.Boru çıkışını kesmek

echo ps | grep $PPID | cut -d" " -f4 

değil iken

Neden

echo $(ps | grep $PPID) | cut -d" " -f4 

çalışır?

cevap

14

nedeni

echo ps 

sadece dize ps yazdırır olmasıdır; ps programını çalıştırmaz. komutadan düzeltilmiş versiyonu olacaktır:

ps | grep $PPID | cut -d" " -f4 

Düzenlendi eklemek için: paxdiablo ps | grep $PPID$(...) sonucu beri echo $(ps | grep $PPID) olarak daraltılmış alacak bir çok bosluk (içerdiğini işaret, bu çift olmadığı zaman -quotes, whitespace tarafından ayrı argümanlara bölünür ve daha sonra echo tüm argümanlarını boşluklarla ayrılmış olarak çıkarır).

ps | grep $PPID | tr -s ' ' | cut -d' ' -f5 

ya da sadece genel olarak başlangıçta ne vardı sopa ile: Bu sorunu gidermek için, tekrarlanan boşluk "sıkmak" için tr kullanabilirsiniz. :-)

+0

olsun - Böylece, grep şey

  • önceki komuta girişli cut -d" " -f4 Yürütme döndürür cut -d "" -f4 bana "bash" verirken ps | grep $ PPID | cut -d "" -f4 bana boş bir alan veriyor – ZPS

  • +0

    Tam olarak değil. İlk versiyonda daraltma alanlarının ekstra etkisi var. – paxdiablo

    +0

    Awwwww haklısın! teşekkürler – ZPS

    2

    sadece echo ps kendi başına çalıştırırsanız Bence, sen boru çalışmıyor neden görürsünüz:

    $ echo ps 
    ps 
    

    Bunun yerine, $0 kontrol edin. Bir oturum açma kabuk bağlıysa, -bash veya bash olabilir. (Peki, herhangi bir kabuk - sadece bash - ama kabuk bir giriş kabuğu ise tire eklenir.)

    5

    ilk satırı:

    echo $(ps | grep $PPID) | cut -d" " -f4 
    

    diyor ki:

    • bir alt kabuk
    • İade çıkış içinde ps | grep $PPID Yürütme - Böyle bir şey olacaktır:

      3559 pts/1 00:00:00 bash 
      

      ve sonra bu çıktıyı yankı ilk parametresi -

    İkinci komut bu durumda size komut adını verir - pratikte, sadece

  • Sonra bu konuda cut -d" " -f4 çalıştırmak çıktı yankı demektir:

    echo ps | grep $PPID | cut -d" " -f4 
    

    diyor ki:

    • Yankı dize ps
    • $PPID için bu dize Grep - $PPID bir sayı içermediği için bu hiçbir zaman bir şey döndürmeyecek, bu yüzden asla ps olmayacaktır. (| Grep $ PPID ps) | $ başka bir şey değildir, bu yüzden yankı, Nedense hiçbir şey