Bash 매뉴얼에서:
3.7.2 명령어 검색 및 실행
명령을 단어로 분할한 후 간단한 명령과 선택적 매개변수 목록을 생성하면 다음이 수행됩니다.
...
이름이 쉘 함수도 내장 함수도 아니고 슬래시를 포함하지 않으면 Bash는 $PATH의 각 요소를 검색하여 해당 이름의 실행 파일이 포함된 디렉터리를 찾습니다.
검색이 성공하거나 명령 이름에 슬래시가 하나 이상 포함되어 있으면 쉘은 별도의 실행 환경에서 지정된 프로그램을 실행합니다. 매개변수 0은 지정된 이름으로 설정되고 명령의 나머지 매개변수는 제공된 매개변수(있는 경우)로 설정됩니다.
파일이 실행 가능한 형식이 아니거나 디렉터리가 아니기 때문에 실행에 실패한 경우,쉘 스크립트라고 가정하면그리고쉘은 39페이지의 3.8절 [쉘 스크립트]에 설명된 대로 이를 실행합니다.
bash 스크립트에
myscript
shebang이 포함되어 있지 않다고 가정합니다.인용문은 스크립트가 명령을 통해 bash에서 실행되면 다음을 의미합니까
myscript
?bash는 먼저 ELF라고 가정하고 호출합니다
execve()
. ELF가 아닌 bash 스크립트이므로execve()
호출이 실패합니다.bash가 다음에 실행됩니까
bash myscript
?
bash에서 bash 스크립트를 실행하는 것과 비교할 때
bash myscript
bash에서 스크립트를 실행할 때 스크립트myscript
직접 호출이 실패합니까execve()
?그렇다면,
myscript
보다 느립 니까bash myscript
? 왜"Mark G. Sobell의 Linux 명령, 편집기 및 쉘 프로그래밍에 대한 실용 가이드"뭔가 비꼬는 말을 해?bash를 사용하여 쉘 스크립트를 실행할 수 있지만 이 기술을 사용하면 자신에게 실행 권한을 부여하고 스크립트를 직접 호출하는 것보다 스크립트가 더 느리게 실행됩니다.
bash 스크립트에
myscript
shebang이 포함된 경우 bash에서 다음 명령을#! /bin/bash
통해 실행될 때myscript
command를 통해 bash에서와 동일한 방식으로 실행됩니까
bash myscript
?스크립트에서 shebang을 제거한 다음 명령을 통해 스크립트를 실행하는 것과 동일한 방식으로 실행됩니까
myscript
?
감사해요.
내 게시물은 다음에서 영감을 얻었습니다.실행 파일처럼 스크립트를 실행하는 것과 셸을 통해 명시적으로 실행하는 것의 차이점은 무엇입니까?그리고Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?
답변1
인용문은 스크립트가 myscript 명령을 통해 bash에서 실행되면 다음을 의미합니까?
- bash는 먼저 ELF라고 가정하고 호출합니다
execve()
. ELF가 아닌 bash 스크립트이므로execve()
호출이 실패합니다.
Bash가 실행 파일을 찾으면 먼저 해당 파일이 운영 체제에서 실행할 수 있는 형식이라고 가정한 다음불러라
execve
. 성공하더라도 여전히 ELF 또는 기타 기본 실행 파일이 아닐 수 있습니다. 예를 들어,Linuxbinfmt_misc
기능을 사용하면다른 많은 실행 파일 형식을 실행할 수 있습니다. 이 특별한 경우에는execve
호출이 실패할 가능성이 높습니다.- bash가 다음에 실행됩니까
bash myscript
?
Bash는 기존 하위 프로세스를 사용하여 내부 스크립트를 실행하고 필요에 따라 셸 환경을 다시 초기화합니다.. 다른 프로세스는 시작되거나
exec
호출되지 않습니다.- bash는 먼저 ELF라고 가정하고 호출합니다
bash에서 bash myscript를 통해 bash 스크립트를 실행하는 것과 비교할 때 bash에서 myscript를 통해 스크립트를 실행할 때 스크립트 호출이 직접 실패합니까
execve()
?예, "실패한 통화"를 의미한다면 그럴 것 같습니다.
그렇다면,
myscript
보다 느립 니까bash myscript
? "Mark G. Sobell의 Linux 명령, 편집기 및 쉘 프로그래밍에 대한 실용 가이드"가 반대라고 말하는 이유는 무엇입니까?bash를 사용하여 쉘 스크립트를 실행할 수 있지만 이 기술을 사용하면 자신에게 실행 권한을 부여하고 스크립트를 직접 호출하는 것보다 스크립트가 더 느리게 실행됩니다.
bash
현재 명예훼손법을 고려할 때 질문의 두 번째 부분에 대해서는 언급하지 않겠지만 몇 가지 실패한 라이브러리 및 시스템 호출이라도 전체 프로세스를 시작한 다음 비교하는 것과 비교할 때 측정 가능한 차이를 만들지 않습니다.해석스크립트. 귀하가 놓쳤을 수 있는 컨텍스트를 찾기 위해 관련 페이지에 액세스할 수 없습니다. 그러나 할 일이 없는 경우는 논의하지 않는 것이 거의 확실하다.
bash 스크립트에
myscript
shebang이 포함된 경우 bash에서 다음 명령을#! /bin/bash
통해 실행될 때myscript
- command를 통해 bash에서와 동일한 방식으로 실행됩니까
bash myscript
?
예, 한 경우에는 shebang 라인이 하위 프로세스에 의해 직접
bash myscript
편집되는exec
반면, 다른 경우에는 시스템이exec
shebang 라인을 찾으면 편집합니다./bin/bash myscript
- 스크립트에서 shebang을 제거한 다음 명령을 통해 스크립트를 실행하는 것과 동일한 방식으로 실행됩니까
myscript
?
합리적으로 감지할 수 있는 한 그렇습니다. 이 중 어느 것도 중요하지 않습니다. 엄밀히 말하면 이 경우
main()
함수는bash
다시 실행되지 않습니다. 왜냐하면 하위 프로세스가 내부적으로 자체적으로 다시 초기화되고 다른 경우에는 실행되기 때문입니다. 정말로 관심이 있다면 이것이 중요한 시나리오를 구성할 수 있지만 노력할 가치는 없습니다.- command를 통해 bash에서와 동일한 방식으로 실행됩니까
이것은 Bash 함수이며sh
기타 쉘 shebangless 스크립트를 실행하려면 또는 다른 쉘을 사용하십시오.bash
, 귀하가 연결한 다른 질문에 명시된 바와 같이 그들 중 하나도 아니고 그들 자신도 아닙니다. 또한 대화형 셸이 bash
shebang 줄의 것과 동일하다고 가정합니다.