「killl」というスクリプトが失敗しましたが、名前を変更した後に正しく機能するのはなぜですか?

「killl」というスクリプトが失敗しましたが、名前を変更した後に正しく機能するのはなぜですか?

問題のスクリプトは、私のローカルホストポート8080の最新のプロセスを終了します。

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

スクリプト名が「killl」の場合は動作しません(わかりましたか?Kill最新?)。cmdsubst> スクリプト名を「asdf」に変更するように求められ、すべてがうまくいきました。この行動の説明はありますか?私はMacOS El Capitánを使用しています。

ベストアンサー1

cmdsubst>zsh入力コマンドの置換が完了するのを待っている間にシェルが出力する補助プロンプトです。

と入力した後にこのプロンプトが表示される場合、唯一合理的な説明は、終了していないコマンド置換を含む項目に拡張されるkilll<Return>エイリアス(文字列マクロ拡張の一種)があることです。例:killl$(...)

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

ここでコマンドの置き換えをオフにzshするように求められます$(...)

追加の注:

  • の出力はlsofpidに基づいてソートされます。 pid番号はラップされており、pidが大きくなってもプロセスが後で始まるという保証はありません。
  • -i:8080ポート8080を送信元ポートまたは宛先ポートとして使用するTCPまたはUDPソケットは、受信、受け入れ、または接続ソケットであるかどうかに関係なく報告されます。
  • 単にpidを取得するには、次の-tオプションを使用できますlsoflsof -ti:8080 | tail -n2
  • kill -9iskill -s KILLは、アプリケーションが正常に終了できないことを示す信号を送信します。最後の手段としてのみ使用してください。

ポート 8080 にソケットバインディング (両端) を持つ最近開始されたプロセスを終了するには、次のようにします。

#! /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 sort(macOSにあります)とpsこのlstart列をサポートする実装(たとえば、macOSとprocps-ng、月と日のフィールドが置き換えられるprocps-ngのコードを更新する必要がある)を想定しています。

おすすめ記事