왜 "killl"이라는 스크립트가 실패하지만 이름을 바꾼 후에도 완벽하게 작동합니까?


12

문제의 스크립트가 로컬 호스트 포트 8080의 최신 프로세스를 종료합니다.

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

스크립트 이름이 'killl'인 경우 작동하지 않습니다 (최근에 Kill?). cmdsubst> 스크립트 이름을 'asdf'로 바꾸라 는 메시지가 표시 되면 모든 것이 작동합니다. 이 행동에 대한 설명이 있습니까? MacOS El Capitán을 사용하고 있습니다.


5
다른 기능, 별칭, 유틸리티 또는 다른 명령이 killl있습니까?
Kusalananda

9
이름을 모호하게 만들지 마십시오. killl철자가 잘못된 것으로 잘못 해석 될 수 있습니다 kill. 보다 명확하고 설명적인 것이 좋습니다 : kill_latest또는 kill_last.
cezar

6
type killl쉘을 시작하려고 시도한 결과는 무엇입니까 ?
Hauke ​​Laging

답변:


27

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 -9kill -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)}'

( sortMac OS에서 찾은 GNU 와) 및 열 ps을 지원 하는 구현을 가정합니다 lstart(macOS 및 procps-ng와 같이 월 및 일 필드가 교환 된 procps-ng에 대해 코드를 업데이트해야 함).


1

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

명령을 입력 할 때 입력하지 않았기 때문에

당신은 입력

킬 $ (
또는 유사합니다. 이것은 스크립트의 이름 아무 관련없었 거나, 처음에는 스크립트라는 것과도 관련이 없었습니다. 완전히 존재하지 않는 명령으로 동일한 효과를 얻을 수 있습니다.

자이크 $ (
쉘 파서는 유일하게 부분적으로 완전한 명령을 완료하기 위해 더 많은 입력을 기대하고 있었다. 스크립트 이름에 대한 당신의 생각은 완전한 붉은 청어입니다.


6
그가 killl $(어떤 이유로 타이핑했다고 말한 것은 꽤 큰 가정 이며, 그렇게 할 가능성은 거의 없습니다. Stéphane Chazelas의 답변이 더 그렇습니다.
Herohtar

1
실제로 오타로 인한 `것보다 $(.
Emil Jeřábek

2
아니요, Emil Jeřábek; 같은 프롬프트를 표시하지 않기` 때문에 전혀 가능성이 없습니다 . 시도 해봐. 아니요, Herhtar; 입력 것을 할 때 그것은 가정이 아니다 또는 이와 유사한이 있다 그 프롬프트를 얻을 수있는 방법 . 공제입니다.
JdeBP

1
당신은 "입력하지 않았다 영업 이익을 주장 killl스테판 Chazelas가가 설명 하듯이, 영업 이익은 참으로 입력 않았다 전적으로 가능한 경우" killl. 따라서 귀하의 답변을 잘못 생각했습니다.
케빈
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.