왜 "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 -9은 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)}'

( 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.