bash에서 시작된 실행 파일 순서


14

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위의 출력에서 볼 수 있듯이 test/ usr / local / bin 디렉토리에 다른 디렉토리가 있고 / usr / bin 디렉토리에 또 다른 디렉토리가 있습니다. 실행 파일의 순서는 어떻게 정해져 있습니까? 즉, 내장 명령이 항상 선호되고 나머지 명령은 $ PATH 변수의 디렉토리 순서에 따라 달라 집니까? 또한 시작된 실행 파일의 순서를 변경할 수 있습니까? 예를 들어, 입력하면 testbash-builtin 대신 / usr / bin / test가 시작 test됩니까?


명령을 호출 할 때 전체 경로를 지정할 수 있습니다 (예 : /usr/bin/test -f "$file"...
jasonwryan

@jasonwryan 나는 이것을 알고 있지만 시작된 실행 파일의 순서를 바꿀 수있는 방법이 있다면 관심이 있습니다.
Martin

답변:


25

가장 우선 순위는 bash 별명, 특수 내장 (POSIX 모드에서만), 기능, 내장 및 검색입니다 $PATH.

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

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

(아래 의견에 따라 업데이트 됨)
(bash가 disable내장 한 잘못된 관리자 편집 문제가 수정 되었습니다. enable)


1
@ 1_CR gena2x가 맞습니다. 내 대답은 POSIX에 따라 기능보다 우선하는 특수 내장을 생략했습니다 (일부 쉘은 호환되지 않지만 bash는 POSIX 모드에서만 준수합니다).
Gilles 'SO- 악마 그만해'

1
제안 편집 : 명령 (또는 그 일부)를 인용 할 때 별칭과 같이 사용할 수 있습니다 \test또는 'test'tes't'.
John Kugelman

2
전체 사진이 아닙니다. 모든 종류의 확장 (bash 매뉴얼에서 모든 대체, 틸드 확장 등으로 확장 )은 별칭을 비활성화합니다. 나는 노력했다.
gena2x

1
bash는 남자 페이지에서 인용 :.. "각각의 간단한 명령의 첫 번째 단어는, 인용 부호로 둘러싸이지 않은 경우,이 별명이 있는지 확인하고, 그 단어는 별명의 텍스트로 대체 그렇다면 문자 /, $, 역 따옴표 및 =위에 나열된 쉘 메타 문자 또는 인용 문자는 별칭 이름으로 표시되지 않을 수 있습니다. "
John Kugelman

2
이 정보의 출처를 찾는 데 도움이되는 힌트는 +1입니다. bash 매뉴얼 페이지의 명령 실행 섹션, 두 번째 및 세 번째 단락에 있습니다.
twan163

6

내장 명령은 항상 외부 명령보다 선호됩니다. 근거는 내장 명령이 빠르다는 것을 (그리고 몇 등의 경우에 cd또는 만 내장 명령 원하는 효과를 가질 수있다).test -o BASH_OPTION

때로는 외부 명령에 쉘 내장 기능이없는 기능이있을 수 있습니다. 이 경우 명시 적 경로 (예 : 슬래시 포함)를 제공하여 외부 명령을 호출 할 수 있습니다 (이의 순서에 대한 우려를 무시 함 $PATH). 외부 경로를 하드 코딩하고 싶지 않지만 내장 사용을 방지하려면 bash, ksh 및 zsh 에서 "$(type -P test)"(note capital P)을 사용할 수 있습니다 . 외부 명령을 사용하는 다른 방법은 내장 ( ) 을 사용 하거나 유틸리티 ( )를 사용하는 것입니다."$(whence -p test)"=testcommandcommand -p test …envenv 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내장 된 함수는 비활성화되지 않은 한 호출됩니다).


wouldnt가 env너무 여기에 적합?
Steven Penny

따라서 쉘이 BusyBox에서 실행되는 경우 일반적으로 동일한 BusyBox의 외부 명령이 내부로 간주됩니까? 예를 들어 df첫 번째 위치에서 PATH에 전체 를 추가 하고 별칭 'df'를 제거하고 which df/ opt / bin / df를 표시하지만 df는 / bin /
df-

@papo which df가 반드시 무엇이 df실행 되는지 보여주지는 않습니다 . unix.stackexchange.com/questions/85249/…
Gilles 'SO- 악의를
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.