~からグレンの答え:
マンページを読んでください
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を含むスクリプトをインポートし、説明なしで印刷します。