전체 경로를 지정하지 않고 Bash 내장 대신 시스템 명령을 사용하십시오.


17

Bash를 대화 형 셸로 사용하고 Bash가 동일한 이름을 공유하는 경우 셸 내장 명령 대신 시스템 명령을 실행하는 쉬운 방법이 있는지 궁금합니다.

예를 들어, 시스템 kill(from util-linux)을 사용하여 신호를 보내는 대신 명명 된 프로세스의 프로세스 ID (pid)를 인쇄하십시오.

$ /bin/kill -p httpd
2617
...

시스템 명령의 전체 경로를 지정하지 않으면 시스템 명령 대신 Bash 내장이 사용됩니다. kill내장은없는 -p명령이 실패 할 수 있도록 옵션 :

$ kill -p httpd
bash: kill: p: invalid signal specification

나는에 나와있는 답하려 만들기 bash는 사용 외부`time` 명령보다는 쉘 내장을 그러나 대부분에만 작동하기 때문에이 time실제로 쉘입니다 키워드 - 아니 쉘 내장 .

로 Bash 내장 기능을 일시적으로 비활성화하는 것 외에도 enable -n kill지금까지 본 최고의 솔루션은 다음을 사용하는 것입니다.

$(which kill) -p httpd

쉘 내장 대신 외부 명령을 실행하는 다른 쉬운 방법이 있습니까?

참고 kill단지 예이며, 내가 원하는 일반화 와 접두어하는 방식과 유사한 솔루션 command실행되는 외부 명령과 동일한 이름을 가진 내장의 방지 기능을. 대부분의 경우 새 프로세스를 forking하고 저장하기 위해 내장 명령을 사용하는 것이 좋으며 내장 명령에 따라 외부 명령이 제공하지 않는 기능이 있습니다.


둘러싸는 which kill(코멘트를 넣을 수 없습니다) 역 따옴표에있는 것은 약간 짧다.
abligh

@abligh 좋은 지적. 나는 명령 대체를 위해 "새로운"구문을 사용하기 위해 몇 년을 훈련했다. :)
Anthony G-Monica의 정의

@abligh : 참고로 'backticks'를 백 슬래시 (\)로 시작하여 주석에 넣을 수 있습니다. 그러나 고수하는 이유가 $(…)- 볼 , , 및 .
G-Man, 'Reinstate Monica'라고

답변:


20

가정 env이 당신의 길에 있다고 가정 :

env kill -p http

env(아마도) 수정 된 환경에서 첫 번째 인수로 명명 된 실행 파일을 실행합니다. 따라서 쉘 내장 명령에 대해서는 알지 못하거나 작동하지 않습니다.

이로 인해 일부 쉘 작업 제어 균열이 발생하지만 외부 명령에 의존하지 않습니다.

exec kill -p bash &

exec현재 셸을 대체하려면 실행 파일이 필요하므로 내장 기능을 사용하지 않습니다. 작업은 백그라운드에서 실행되므로 현재 쉘이 아닌 분기 된 배경 쉘을 교체합니다.


2
envIMHO의 정답입니다.
abligh

@ abligh : 당신은 내 삭제 된 답변에 댓글에 맞습니다. command -p cmd에서 외부 명령을 호출 zsh하지 않습니다 bash.
cuonglm

6
(exec kill -p http)작업이 현재 쉘 대신 하위 쉘을 대체하게하며 작업 제어 크루프를 처리 할 필요가 없습니다.
Michael Hoffman

1
@AnthonyGeoghegan 실제로 env는 쉘이 아니기 때문에 쉘 내장에 대해 알지 못합니다. 당신은 nice또는 xargs다른 프로그램과 같은 효과를 얻을 것입니다.
user253751

1

원하는 것을하는 가장 간단한 방법은

alias kill="/bin/kill"

당신에 ~/.bashrc파일. 그 후, bash를 새로 로그인 / 호출 할 때마다 "kill"이로 해석됩니다 /bin/kill.


나는 이미 별명을 생각했고 이것이 내가 연결 한 질문에 나열된 해결책 중 하나 였지만 command, 각 "그림자"명령에 대해 별도의 별명을 작성하기보다는보다 일반적인 솔루션 (솔루션과 유사 함)을 원합니다 . 나는 이것을 명확하고 명확하게하기 위해 내 질문을 편집했습니다. 대부분의 경우 작업 ID로 프로세스를 지정할 수 있으므로 일반적으로 내장 버전을 사용하는 것이 좋습니다. 어쨌든 고마워
Anthony G-Monica에 대한 정의

1

타이핑이 필요한 솔루션을 알고 타이핑이 덜 필요한 솔루션을 원한다면 다음과 같이 빌드하십시오.

runFile() { local cmd="$1"; shift; cmd="$(which "$cmd")" && "$cmd" "$@"; }

일반적으로 약간의 노력을 기울이는 것을 축약 화하는 것이 컴퓨터의 장점입니다.


1
그것은 좋은 일반적인 요점이므로 귀하의 답변을 찬성합니다. 지난 몇 년 동안 저는 정기적으로 사용하는 시스템에 대한 별칭, 함수 및 스크립트 모음을 구축했습니다. 그러나 때로는 설치하지 않은 새로 설치 또는 서버에서 작업해야하기 때문에 가능한 경우 사용자 지정되지 않은 솔루션을 사용하는 것을 선호합니다. 감사.
Anthony G-Monica에 대한 정의

1

이 매우 특정한 경우, 명령 pgrep은 필요에 정확히 일치합니다.

일반적으로 함수가 작동합니다. "파일 명령"에서 :

fcmd(){ local a=$1; shift; $(which "$a") "$@"; }

전화하다

fcmd kill -p httpd

그러나 타이핑이 덜 필요한 경우 좋은 별칭보다 더 짧은 방법은 없습니다.

"list pid"(lp) 개념에서 :

alias lp='/bin/kill -p'

그런 다음 다음을 입력하십시오.

lp httpd

0

(zsh에서) 내장 명령 대신 시스템 버전을 얻기 위해 명령 이름 앞에 = 기호를 붙일 수 있습니다. 또한 특정 시나리오를 망칠 수있는 별칭을 피할 수있는 편리한 방법입니다.

$ =kill -p httpd

1
Bash 버전 4.3.30으로 시도했지만 작동하지 않았습니다. 나는 그런 구문을 본 적이 없다. 이 기능이 문서화 된 곳에 링크를 추가 할 수 있습니까? 일반적으로 앨리어싱되지 않은 버전의 명령을 실행하기 위해 별칭에 백 슬래시를 붙입니다.
Anthony G-Monica에 대한 정의

@Anthony 아마도 이것이 zsh유일한 것입니다. 정기적으로 사용하지만 bash내일 컴퓨터에서 확인하겠습니다 .
Caleb

나는 내가 익숙하지 않은 쉘일지도 모른다고 생각했다 (나는 bash, dash 및 csh에만 익숙하다). 에 대해서만 작동하는 다른 답변 (삭제 이후)이 zsh있었습니다. 이 질문에 태그를 bash달고 제목에 사용했지만 zsh 사용자가 여전히 유용하다고 생각 하므로이 답변을 유지해야합니다.
Anthony G-Monica에 대한 정의

-1

kill맨 페이지 에 대한 버그 보고서를 보낼 수 있으며 여기에 기능을 가져 오려고 할 때마다 pkill사용 되는 비표준 옵션이 포함 된 이유를 물 pkill을 수 있습니다.pkill.

전화하면 :

pkill httpd

설명하는 문제를 피하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.