~에서글렌의 답변:
맨페이지를 읽어보세요
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
명령이 주석이나 문자열처럼 보이거나 실제 인터프리터와 유사한 방식으로 작성되는 다국어 스크립트입니다 . 예:- 인터프리터에 스크립트를 제공하고 첫 줄을 제거합니다.
- Bash 및 프로세스 대체를 사용한 예
- 애벌레
40_custom
, 그 반대의 경우도 마찬가지입니다. shebang이 포함된 스크립트를 가져와서 설명 없이 인쇄합니다.