쉘은 이름이 같은 키워드, 내장 명령, 외부 명령 중 실행할 것을 어떻게 결정합니까? [복사]

쉘은 이름이 같은 키워드, 내장 명령, 외부 명령 중 실행할 것을 어떻게 결정합니까? [복사]

동일한 이름을 가진 내장 명령, 키워드 및/또는 외부 명령이 있을 때 Bash 쉘이 실행할 명령을 결정하는 순서는 무엇입니까?

예를 들어,

  • 키워드 time및 외부 명령 time,
  • coreutils용 내장 printf및 외부 명령 printf.

답변1

~에서GNU Bash 참조 매뉴얼:

명령을 단어로 분할한 후 간단한 명령과 선택적 매개변수 목록을 생성하면 다음이 수행됩니다.

  1. 명령 이름에 슬래시가 포함되어 있지 않으면 쉘은 슬래시를 찾으려고 시도합니다. 해당 이름의 쉘 함수가 존재하는 경우 다음과 같이 호출됩니다.쉘 기능.

  2. 이름이 함수와 일치하지 않으면 쉘은 쉘 내장 함수 목록에서 해당 이름을 검색합니다. 일치하는 항목이 발견되면 내장 함수가 호출됩니다.

  3. 이름이 쉘 함수도 내장 함수도 아니고 슬래시를 포함하지 않으면 Bash는 $PATH해당 이름의 실행 파일이 포함된 디렉터리의 모든 요소를 ​​검색합니다. Bash는 여러 검색을 피하기 위해 해시 테이블을 사용하여 실행 파일의 전체 경로 이름을 기억합니다 PATH(참조:Bourne Shell 내장 함수). $PATH해시 테이블에서 명령을 찾을 수 없는 경우에만 디렉토리 전체 검색이 수행됩니다. 검색에 실패하면 쉘은 이름이 정의된 쉘 함수를 검색합니다 command_not_found_handle. 함수가 존재하는 경우 함수는 원래 명령과 원래 명령의 인수를 인수로 사용하여 호출되며 함수의 종료 상태는 쉘의 종료 상태가 됩니다. 이 함수가 정의되지 않은 경우 쉘은 오류 메시지를 인쇄하고 종료 상태 127을 반환합니다.

  4. 검색이 성공하거나 명령 이름에 슬래시가 하나 이상 포함되어 있으면 쉘은 별도의 실행 환경에서 지정된 프로그램을 실행합니다. 매개변수 0은 지정된 이름으로 설정되고 명령의 나머지 매개변수는 제공된 매개변수(있는 경우)로 설정됩니다.

  5. 파일이 실행 가능한 형식이 아니고 파일이 디렉터리가 아니기 때문에 이 실행이 실패하면 해당 파일은 쉘 스크립트로 간주되고 쉘은 다음에 설명된 대로 이를 실행합니다.쉘 스크립트.

  6. 명령이 비동기적으로 시작되지 않으면 쉘은 명령이 완료될 때까지 기다리고 종료 상태를 수집합니다.

답변2

이름 충돌이 발생하면 bash는 먼저 내장 명령을 호출하려고 시도합니다. 다음 테스트를 수행했습니다.

time sleep 100 &
ps -ef | grep [t]est

외부 명령은 새 프로세스를 생성해야 하지만 결과가 표시되지 않습니다. 이는 내장 명령이 호출되었음을 의미합니다.

관련 정보