이것은 제가 항상 궁금했던 일반적인 질문이지만 간략히 설명하자면: bash는 스크립트나 터미널을 통해 주어진 명령을 어떻게 실행합니까?
나는 다음과 같이 모든 명령을 검사하는 여러 개의 if 문을 갖는 것이 가능할 것이라고 생각했습니다(의사 코드).
if (command == "pwd") pwd();
else if (command == "echo") echo();
...
그러나 이는 Firefox 또는 gedit와 같은 프로그램에 대해 실행되는 명령과 같이 새 명령이 추가될 때마다 코드를 다시 컴파일해야 하기 때문에 문제가 발생합니다.
그런 다음 이 명령이 기억났습니다. 이 which
명령은 (말장난 의도 없이) 주어진 명령의 디렉터리를 가리키며, 이로 인해 bash가 파일을 찾고 iostream을 사용하여 파일을 실행한다고 가정하게 됩니다.
그렇습니까? 그렇다면 어떤 메서드를 호출할지 어떻게 알 수 있나요? 아니면 그냥 일반 실행 파일인가요?
답변1
명령이 존재하는 경우 내부적으로 작동하는 방법은 다음과 같습니다. 일반 일반 표준 입력을 사용하여 명령(스크립트에서 왔는지 여부에 관계없이)과 해당 인수를 저장한 다음 구문 분석하여 execve
다음 과 같이 시스템 호출로 보냅니다. 그런 다음 시스템에서 명령을 실행합니다.
http://man7.org/linux/man-pages/man2/execve.2.html
또한 Time4Tea가 말했듯이 실행 중인 셸에 고유한 몇 가지 내장 명령이 있습니다. exit
그 중 하나입니다.
경험상, 기존의 어떤 방법으로도 Linux에 대해 알아낼 수 없다면 소스 코드를 찾아보세요.
답변2
기본적으로 일부 명령은 bash 쉘 프로그램 자체에 내장되어 있습니다(예: echo, set). 이 경우 bash에는 명령줄에서 호출하는 사용자에 대한 응답으로 이러한 명령을 내부적으로 실행하기 위해 컴파일된 코드가 있습니다. man bash
또는 의 매뉴얼을 보면 info bash
"내장 기능" 목록이 있습니다.
내장 명령 중에 명령이 없으면 쉘은 $PATH 환경 변수에 나열된 디렉토리(나열된 순서대로)를 검색하여 거기에서 외부 명령을 찾을 수 있는지 확인합니다. 그렇지 않은 경우 명령을 찾을 수 없음 오류가 보고됩니다.