스크립트의 shebang에서 인터프리터에 여러 인수가 전달되도록 하려면 어떻게 해야 합니까?

스크립트의 shebang에서 인터프리터에 여러 인수가 전달되도록 하려면 어떻게 해야 합니까?

~에서글렌의 답변:

맨페이지를 읽어보세요 execve(2). 개별 선택적 매개변수에 대한 제한은 운영 체제에 따라 다릅니다. Linux는 인터프리터 뒤의 모든 단어를 매개변수로 처리합니다.

이를 수행하려면 다음을 수행하십시오.

#! /path/to/interpreter arg1 arg2 arg3

사실 넌 이렇게 해야 해

#!/bin/sh
exec /path/to/interpreter arg1 arg2 arg3 "$@"

스크립팅 언어로 일부 코드가 포함된 스크립트를 작성하려면 다음을 수행하십시오.

#! /path/to/interpreter arg1 arg2 arg3

<script content in the script language>

Glenn의 답변을 바탕으로 스크립트를 다음과 같이 작성해야 합니다.

#!/bin/sh
exec /path/to/interpreter arg1 arg2 arg3 "$@"

그럼 어디에 써야 할까요 <script content in the script langauge>? 쉘 언어가 아닌 스크립팅 언어로 작성되었기 때문에 쉘 스크립트에 넣을 수는 없겠죠? 어디에 넣어야 하나요?

감사해요.

답변1

muru가 제공하는 옵션 외에도 또 다른 옵션이 있습니다. 스크립트의 복잡성과 길이에 따라 스크립트를 쉘 스크립트에 넣을 수 있습니다(이것이 일반적으로 유용한지는 또 다른 질문입니다!)"여기에 문서화" 메커니즘, 다음과 같이 쉘 파이프 텍스트를 다른 프로그램에 포함할 수 있습니다:

테스트 파일

#!/bin/sh
exec /usr/bin/python3 <<EOF
import datetime
print("The time is now "+str(datetime.datetime.now()))
EOF

프로그램이 매우 크다면 사용하지 않을 것입니다. 그러한 스크립트를 편집하는 것은 어렵기 때문입니다. 이러한 스크립트는 다른 언어에 포함되어 있으므로 테스트하려면 스크립트를 추출하여 수정해야 합니다.

이상하게도 쉘은 여전히 ​​이 방법을 사용하여 쉘 변수를 확장하고 특수 문자를 해석합니다.

#!/bin/sh
exec /usr/bin/python3 <<EOF
print("The current user is $USER and date is $(date).")
EOF

반품 The user is erik and date is Fri Apr 6 22:14:23 MDT 2018.

답변2

exec해당 줄을 무시하고 스크립트 내용을 정상적으로 파일에 넣도록 인터프리터를 속여야 합니다 . 옵션은 다음과 같습니다:

  • exec명령이 주석이나 문자열처럼 보이거나 실제 인터프리터와 유사한 방식으로 작성되는 다국어 스크립트입니다 . 예:
  • 인터프리터에 스크립트를 제공하고 첫 줄을 제거합니다.

관련 정보