Bash işleci <,>, | ve grep / öldür


3

Bir egzersiz olarak, temel bash prensiplerini kullanarak bir işlemi komut satırından öldürmek istedim ancak anlamadığım bazı hatalar yaşıyorum:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | kill

1) çalışmıyor

Eğer denersem

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' > kill

2) ya da çalışmıyor

3) (..) egrep '\d' (...)Yaparsam, bu [0-9] ile aynı olmamalı mı?

4) Böyle bir şey yapmamın bir yolu var mı:

kill < (greps (...) )
linux  bash  grep  kill 

Bu neden göç ediyor? Programlama ile ilgili değil mi?
aioobe

Bunun taşındığı çok saçma. Kabuk komut dosyası kesinlikle programlama ile ilgili.
riwalk

1
Her şeyden önce: nautilus -q(!!); Aksi killall name, pgrep -fl name,pkill -f name
sehe

Yanıtlar:


5

Deneyin

kill `ps -A | grep nautilus | egrep -o '[0-9]{4,5}'`

Geri tepme çubukları içindeki komutlar, komutun bir parçası olarak yürütülür ve beslenir.


3
... veya $()backticks yerine kullanmak , okuması daha kolay :)
slhck

4
4-5 hane varsayımı tuhaf; Çoğu ps uygulaması, pids solunu sıfır basmaz ve pid kullanımı etrafa sarılabilir. Bazı işletim sistemleri bile 16 bitden fazla pid alanı kullanıyor.
Phil P

3
  1. |Operatör hakkının "standart girdi" için soldan "standart çıktı" (stdout) besler; standart girdi veya stdin, "eğer bana yazarlarsa kullanıcıdan sanki ne okuduğumu" eşdeğerdir. kill(1)Komut değil onun stdin, onun komut satırında sağlanan süreç kimlikleri öldürür. Yani daha xargsönce eklemek killyardımcı olacaktır:

    ... | xargs kill

    çünkü xargs(1)stdin'i alır ve parçalara ayırır, verilen komutları tekrar tekrar çağırmak için (burada, "öldür") bu parçalardan oluşan komut satırlarıyla tekrar tekrar çağırmak için.

  2. >Operatör bir dosyaya stdout yönlendirmek için kullanılır, bu yüzden dosya adı "öldürmek" ve pid'ler içeriğini sahiptir geçerli dizinde yeni bir dosya oluşturduk.

  3. Model \d, "standart" veya "genişletilmiş" normal ifade dillerinin bir parçası değildir; bunun yerine Perl (inanıyorum) tarafından tanıtıldı ve normal ifade dilinin daha sonraki varyantlarında. PCRE, Perl Uyumlu Düzenli İfadeler için, genişletilmiş sözdizimini diğer birçok araç ve dile yaymada etkili olan bir kitaplık sağlar, ancak bugün kesinlikle tek uygulama bu değildir. Sizin için farklı regexp dillerinin matris karşılaştırmalarını sağlayacak web siteleri var.

    PCRE sizin için pcregrep(1)anlayacağınız gemilerle \d; Ayrıca, modern GNU grep, -Pregexps için PCRE'yi kullanacak seçeneğe sahiptir .

  4. Komutun stdout'unun doğrudan komut satırında kullanıldığı "komut değiştirme" konseptinden sonra buradasınız; Bunun için modern sözdizimi $(...), gerçekte kullanılan backtick'leri de görebilseniz de,… ... ancak bu tarihseldir ve iyi iç içe geçmez. Yani:

    kill $(ps ... | pcregrep ... | munge)

2

Yürütülebilir dosyanın adını biliyorsanız pidof, çalışan programın yardımını bulmak için kullanmak daha iyidir .


2

Ayrıca deneyebilirsiniz killall:

killall nautilus

(paketten psmisc, en azından debian / ubuntu içinde).


1
OP işletim sistemlerini açıklamadı. Umarım, düşündüğünüzü killallyapmayan Solaris gibi SysV değildir. ;)
Phil P


0

Gideceğim xargs:

ps -A | grep nautilus | egrep -o '[0-9]{4,5}' | xargs -L 1 kill

Aslında, killbirden fazla argüman kabul eder, bu yüzden -L 1kesinlikle gerekli değildir.


-1
   ps -A | grep nautilus | awk '{print "kill " $1}' | bash

Bunu bu şekilde yapardım, ama aynı şeyi yapmanın pek çok yolu var =) Bu cevabı stackoverflow üzerinde detaylı bir şekilde yazdım, buraya taşındığını bulmak için yazdım.


niye ya? Meraklı. Özellikle 'awk' son bölümü hakkında {print "kill" $ 1} '| bash '
matchew
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.