Shebang이 있든 없든 파일 이름으로 명령 이름으로 bash 스크립트를 어떻게 실행할 수 있습니까?

Shebang이 있든 없든 파일 이름으로 명령 이름으로 bash 스크립트를 어떻게 실행할 수 있습니까?

Bash 매뉴얼에서:

3.7.2 명령어 검색 및 실행

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

...

  1. 이름이 쉘 함수도 내장 함수도 아니고 슬래시를 포함하지 않으면 Bash는 $PATH의 각 요소를 검색하여 해당 이름의 실행 파일이 포함된 디렉터리를 찾습니다.

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

  3. 파일이 실행 가능한 형식이 아니거나 디렉터리가 아니기 때문에 실행에 실패한 경우,쉘 스크립트라고 가정하면그리고쉘은 39페이지의 3.8절 [쉘 스크립트]에 설명된 대로 이를 실행합니다.

  1. bash 스크립트에 myscriptshebang이 포함되어 있지 않다고 가정합니다.

    • 인용문은 스크립트가 명령을 통해 bash에서 실행되면 다음을 의미합니까 myscript?

      • bash는 먼저 ELF라고 가정하고 호출합니다 execve(). ELF가 아닌 bash 스크립트이므로 execve()호출이 실패합니다.

      • bash가 다음에 실행됩니까 bash myscript?

    • bash에서 bash 스크립트를 실행하는 것과 비교할 때 bash myscriptbash에서 스크립트를 실행할 때 스크립트 myscript직접 호출이 실패합니까 execve()?

    • 그렇다면, myscript보다 느립 니까 bash myscript? 왜"Mark G. Sobell의 Linux 명령, 편집기 및 쉘 프로그래밍에 대한 실용 가이드"뭔가 비꼬는 말을 해?

      bash를 사용하여 쉘 스크립트를 실행할 수 있지만 이 기술을 사용하면 자신에게 실행 권한을 부여하고 스크립트를 직접 호출하는 것보다 스크립트가 더 느리게 실행됩니다.

  2. bash 스크립트에 myscriptshebang이 포함된 경우 bash에서 다음 명령을 #! /bin/bash통해 실행될 때myscript

    • command를 통해 bash에서와 동일한 방식으로 실행됩니까 bash myscript?

    • 스크립트에서 shebang을 제거한 다음 명령을 통해 스크립트를 실행하는 것과 동일한 방식으로 실행됩니까 myscript ?

감사해요.

내 게시물은 다음에서 영감을 얻었습니다.실행 파일처럼 스크립트를 실행하는 것과 셸을 통해 명시적으로 실행하는 것의 차이점은 무엇입니까?그리고Shebang 없이 스크립트를 실행하는 쉘 인터프리터는 무엇입니까?

답변1

    • 인용문은 스크립트가 myscript 명령을 통해 bash에서 실행되면 다음을 의미합니까?

      • bash는 먼저 ELF라고 가정하고 호출합니다 execve(). ELF가 아닌 bash 스크립트이므로 execve()호출이 실패합니다.

      Bash가 실행 파일을 찾으면 먼저 해당 파일이 운영 체제에서 실행할 수 있는 형식이라고 가정한 다음불러라execve. 성공하더라도 여전히 ELF 또는 기타 기본 실행 파일이 아닐 수 있습니다. 예를 들어,Linux binfmt_misc기능을 사용하면다른 많은 실행 파일 형식을 실행할 수 있습니다. 이 특별한 경우에는 execve호출이 실패할 가능성이 높습니다.

      • bash가 다음에 실행됩니까 bash myscript?

      Bash는 기존 하위 프로세스를 사용하여 내부 스크립트를 실행하고 필요에 따라 셸 환경을 다시 초기화합니다.. 다른 프로세스는 시작되거나 exec호출되지 않습니다.

    • bash에서 bash myscript를 통해 bash 스크립트를 실행하는 것과 비교할 때 bash에서 myscript를 통해 스크립트를 실행할 때 스크립트 호출이 직접 실패합니까 execve()?

      예, "실패한 통화"를 의미한다면 그럴 것 같습니다.

    • 그렇다면, myscript보다 느립 니까 bash myscript? "Mark G. Sobell의 Linux 명령, 편집기 및 쉘 프로그래밍에 대한 실용 가이드"가 반대라고 말하는 이유는 무엇입니까?

      bash를 사용하여 쉘 스크립트를 실행할 수 있지만 이 기술을 사용하면 자신에게 실행 권한을 부여하고 스크립트를 직접 호출하는 것보다 스크립트가 더 느리게 실행됩니다.

      bash현재 명예훼손법을 고려할 때 질문의 두 번째 부분에 대해서는 언급하지 않겠지만 몇 가지 실패한 라이브러리 및 시스템 호출이라도 전체 프로세스를 시작한 다음 비교하는 것과 비교할 때 측정 가능한 차이를 만들지 않습니다.해석스크립트. 귀하가 놓쳤을 수 있는 컨텍스트를 찾기 위해 관련 페이지에 액세스할 수 없습니다. 그러나 할 일이 없는 경우는 논의하지 않는 것이 거의 확실하다.

  1. bash 스크립트에 myscriptshebang이 포함된 경우 bash에서 다음 명령을 #! /bin/bash통해 실행될 때myscript

    • command를 통해 bash에서와 동일한 방식으로 실행됩니까 bash myscript?

    예, 한 경우에는 shebang 라인이 하위 프로세스에 의해 직접 bash myscript편집되는 exec반면, 다른 경우에는 시스템이 execshebang 라인을 찾으면 편집합니다./bin/bash myscript

    • 스크립트에서 shebang을 제거한 다음 명령을 통해 스크립트를 실행하는 것과 동일한 방식으로 실행됩니까 myscript?

    합리적으로 감지할 수 있는 한 그렇습니다. 이 중 어느 것도 중요하지 않습니다. 엄밀히 말하면 이 경우 main()함수는 bash다시 실행되지 않습니다. 왜냐하면 하위 프로세스가 내부적으로 자체적으로 다시 초기화되고 다른 경우에는 실행되기 때문입니다. 정말로 관심이 있다면 이것이 중요한 시나리오를 구성할 수 있지만 노력할 가치는 없습니다.

이것은 Bash 함수이며sh기타 쉘 shebangless 스크립트를 실행하려면 또는 다른 쉘을 사용하십시오.bash, 귀하가 연결한 다른 질문에 명시된 바와 같이 그들 중 하나도 아니고 그들 자신도 아닙니다. 또한 대화형 셸이 bashshebang 줄의 것과 동일하다고 가정합니다.

관련 정보