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

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

나는 Bash를 대화형 셸로 사용하고 있으며 Bash가 셸 내장 대신(같은 이름을 공유하는 경우) 시스템 명령을 실행하도록 하는 쉬운 방법이 있는지 궁금합니다.

예를 들어, 신호를 보내는 대신 지정된 프로세스의 프로세스 ID(pid)를 인쇄하려면 system kill(from )을 사용하세요.util-linux

$ /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해결 방법은 내장 접두사를 사용하여 외부 명령과 동일한 이름의 함수 실행을 방지하는 방법과 유사합니다. 나는 일반적으로 새 프로세스를 포크하는 비용을 절약하기 때문에 대부분의 경우 내장 버전을 사용하는 것을 선호하며 때로는 내장 버전에 외부 명령이 제공하지 않는 기능이 있습니다.

답변1

env귀하의 경로에서 가정 :

env kill -p http

env(아마도) 수정된 환경에서 첫 번째 인수로 명명된 실행 파일을 실행하므로 쉘 내장 기능을 모르거나 사용하지 않습니다.

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

exec kill -p bash &

exec현재 셸을 대체하려면 실행 파일이 필요하므로 내장 명령이 사용되지 않습니다. 이 작업은 백그라운드에서 실행되므로 현재 셸 대신 분기된 백그라운드 셸을 교체할 수 있습니다.

답변2

아마도 원하는 것을 수행하는 가장 쉬운 방법은 선을 긋는 것입니다.

alias kill="/bin/kill"

귀하의 파일에 ~/.bashrc. 그 후, bash의 모든 새로운 로그인/호출은 "kill"을 /bin/kill.

답변3

약간의 입력이 필요한 솔루션을 알고 있고 입력이 덜 필요한 솔루션을 원하는 경우 다음과 같이 빌드하세요.

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

컴퓨터는 일반적으로 약간의 노력이 필요한 작업을 단축하는 데 능숙합니다.

답변4

(zsh에서) 명령 이름 앞에 = 기호를 추가하면 내장 버전 대신 시스템 버전을 얻을 수 있습니다. 이는 특정 시나리오에서 혼동을 일으킬 수 있는 별칭을 방지하는 편리한 방법이기도 합니다.

$ =kill -p httpd

관련 정보