Neden “killl” isimli betiğim başarısız oluyor, ancak yeniden adlandırdıktan sonra mükemmel çalışıyor?


12

Söz konusu komut dosyası, localhost bağlantı noktası 8080'deki en son işlemi sonlandırıyor.

#!/bin/bash
x=$(lsof -i:8080 | tail -1 | awk '{print $2}')
kill -9 $x

Komut dosyası 'killl' olarak adlandırılmışsa (işe yaramadı mı? Bu bana bir istem verdi cmdsubst> 'asdf' senaryoyu yeniden adlandırma, her şey çalışıyor. Bu davranış için bir açıklama var mı? MacOS El Capitán kullanıyorum.


5
Başka bir fonksiyonunuz, takma adınız, yardımcı programınız veya başka bir komutunuz var killlmı?
Kusalananda

9
İsimleri belirsiz yapmayın. killlyanlış hecelendiği gibi yanlış yorumlanabilir kill. Açık ve daha açıklayıcı olmak daha iyidir: kill_latestveya kill_last.
cezar

6
type killlBaşlatmaya çalıştığınız kabuktaki çıktı nedir ?
Hauke ​​Laging

Yanıtlar:


27

cmdsubst>zshgirilen bir komut değişikliğinin sonunu beklerken kabuk tarafından yazdırılan ikincil bilgi istemidir .

Sadece girildikten sonra bu istemi alırsanız killl<Return>, o zaman makul olan tek açıklama, bunun gibi killlsonlandırılmamış bir $(...)komut ikamesi içeren bir şeye genişleyen bir takma adınızın (dize makrosu genişletmesinin bir şeklidir) olmasıdır :

$ alias 'killl=echo $(lsof -ti'
$ killl :22
cmdsubst>

zshBu $(...)komut değişikliğini kapatmanı nerede istiyor?

Birkaç not daha:

  • çıktısı lsofpid'e göre sıralanır. pid numaraları sarılır, daha büyük bir pid, işlemin daha sonra başlatıldığını garanti etmez.
  • -i:8080 8080 bağlantı noktasına sahip TCP veya UDP yuvalarını, ister dinleme, kabul etme veya bağlantı soketi olsun, kaynak veya hedef bağlantı noktası olarak bildirir.
  • Yalnızca pid'i almak istiyorsanız, aşağıdaki -tseçeneği kullanabilirsiniz lsof:lsof -ti:8080 | tail -n2
  • kill -9bir kill -s KILLuygulama incelikle çıkış üzerine hareket edemez bir sinyal gönderir. Sadece son çare olarak kullanılmalıdır.

8080 numaralı bağlantı noktasında bir sokete bağlı (her iki uçta) en son başlatılan işlemi öldürmek için şunları yapabilirsiniz:

#! /bin/sh -
unset IFS
pids=$(lsof -ti:8080) &&
  LC_ALL=C ps -o pid=,lstart= -p $pids |
  LC_ALL=C sort -k6,6n -k4,4M -k3,3n -k5,5 -k1,1n |
  awk 'END{system("kill " $1)}'

(GNU'yu sort( macOS'ta olduğu gibi ) ve sütunu psdestekleyen bir uygulamayı varsayar ( lstartmacOS ve procps-ng'ler gibi, ancak ay ve gün alanlarının değiştirildiği procps-ng için kodun güncellenmesi gerekir).


1

Bana bir istem verdi cmdsubst>

Çünkü komutu yazarken yazmadınız

killl
sen yazdın

killl $ (
veya benzeri. Bu, komut dosyasının adıyla ilgisi yoktu , hatta ilk başta bir komut dosyası olduğu bile. Tamamen var olmayan bir komutla aynı etkiyi elde etmiş olabilirsiniz:

Zeick $ (
Kabuğun ayrıştırıcısı, kısmen tamamlanan tek komutu tamamlamak için daha fazla girdi bekliyordu. Senaryo adı hakkındaki düşünceniz tamamen kırmızı bir ringa balığı.


6
Herhangi bir killl $(nedenle yazdığını söylemek oldukça büyük bir varsayım ve bunu yapması pek olası değil. Stéphane Chazelas'ın cevabı daha olasıdır.
Herohtar

1
Gerçekten bir yazım hatası nedeniyle ise, o `zaman daha muhtemeldir $(.
Emil Jeřábek

2
Hayır, Emil Jeřábek; aynı istemi vermediğinden` , hiç de olası değildir . Dene. Hayır, Herhtar; yazarak bu zaman bir varsayım değil veya benzer olan bu istemi almak için bir yol . Bu bir kesinti.
JdeBP

1
killlStéphane Chazelas'ın açıkladığı gibi OP'nin “ yazmadığı” iddiasında OP'nin gerçekten yazması tamamen mümkündür killl. Bu nedenle, cevabınızı yanlış olarak indirdim.
Kevin
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.