"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옵션을 사용할 수 있습니다 lsof.lsof -ti:8080 | tail -n2
  • kill -9is kill -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에 있음) 및 pslstart열을 지원하는 구현(예: macOS 및 procps-ng, 월 및 일 필드가 교체되는 procps-ng에 대해 코드를 업데이트해야 함)을 가정).

답변2

그것은 나에게 힌트를 주었다cmdsubst>

명령을 입력하면 입력되지 않기 때문입니다.

죽이다
당신은 입력

죽여라$(
또는 유사합니다. 이것은아무 관련이 없습니다스크립트인 경우에도 스크립트의 이름입니다. 전혀 존재하지 않는 명령을 사용하여 동일한 효과를 얻을 수 있습니다.

카이케$(
쉘의 구문 분석기는 부분적으로 완료된 명령을 완료하려면 더 많은 입력이 필요합니다. 스크립트 이름에 대한 귀하의 아이디어는 완전한 붉은 청어입니다.

관련 정보