Bash에서 실행되는 실행 파일 순서

Bash에서 실행되는 실행 파일 순서

testBash에서 명령을 실행하면 test내장 유틸리티(조건식 평가)가 시작됩니다.

$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$ 

그러나 위의 출력에서 ​​볼 수 있듯이 type -a test/usr/local/bin 디렉토리에 또 다른 하나가 있고 test/usr/bin 디렉토리에 또 다른 하나가 있습니다. 기본 제공 명령이 항상 선호되고 나머지는 $PATH 변수의 디렉터리 순서에 따라 달라지도록 실행 파일의 순서는 어떻게 되나요? 또한 실행 파일의 시작 순서를 변경할 수 있습니까? 예를 들어 test/usr/bin/test 를 입력하면 bash-buildin 대신 시작됩니까 test?

답변1

가장 높은 우선순위는 bash 별칭, 특수 내장(POSIX 모드에서만), 함수, 내장, 입니다 $PATH.

내장 기능을 실행하려면 를 사용하세요 builtin test.
외부 애플리케이션을 실행하려면 명시적 경로를 사용하세요 /bin/test.
함수와 별칭을 무시하려면 을 사용하세요 command test.
별칭을 무시하려면 \test또는 다른 종류의 확장을 사용하세요.

내장 을 비활성화/활성화할 수 있습니다 enable test.

(아래 설명을 기반으로 업데이트됨)
(bash 내장의 잘못된 관리자 편집 수정 disable- 실제로만 enable)

답변2

내장 명령은 항상 외부 명령보다 우선합니다. 그 근거는 내장 명령이 더 빠르다는 것입니다(또는 cd또는 같은 일부 경우에는 내장 명령만 원하는 효과를 얻을 수 있습니다).test -o BASH_OPTION

때때로 외부 명령에는 셸의 내장 명령에 없는 기능이 있을 수 있습니다. 이 경우 명시적인 경로(예: 슬래시 포함)를 제공하여 외부 명령을 호출할 수 있습니다(이렇게 하면 중앙 정렬 순서에 대한 우려가 무시됩니다 $PATH). 외부 경로를 하드코딩하고 싶지 않지만 내장 경로의 사용을 방지하려는 경우 bash, ksh 및 zsh에서 이를 사용할 수 있습니다 "$(type -P test)"(대문자 사용 참고). 외부 명령을 강제로 사용하는 또 다른 방법은 유틸리티( )를 사용하는 것입니다.P"$(whence -p test)"=testenvenv test …

zsh에서는 내장 기능 비활성화를 사용할 수 있습니다 disable test. 이는 내장 기능이 다시 활성화될 때까지 (현재 쉘 또는 하위 쉘에 대해) 영구적입니다 enable test. Bash에서는 동일한 작업을 수행하여 enable -n test비활성화하고 enable test다시 활성화할 수 있습니다.

alias test=/usr/bin/test별칭이나 함수를 사용하여 또는 같은 다른 명령을 강제할 수 있습니다 test () { /usr/bin/test "$@"; }. 그러한 별칭이 있는 경우 해당 별칭의 일부를 참조하여 해당 별칭의 사용을 방지할 수 있습니다. 예를 들어 \test일반 함수/내장/외부 조회가 수행됩니다. 셸 및 해당 설정에 따라 함수를 읽거나 실행할 때 함수의 별칭 정의가 확장될 수 있습니다. 함수를 정의하면 command test함수 조회와 별칭 조회를 방지하는 데 사용할 수 있습니다. 따라서 test비활성화하지 않는 한 내장 함수가 여기에서 호출됩니다.

관련 정보