shebangに関するbashマニュアルから
ほとんどのUnixバージョンには、オペレーティングシステムのコマンド実行メカニズムの一部として含まれています。スクリプトの最初の行が2文字の「#!」で始まる場合、行の残りの部分はプログラムのインタプリタを指定します。したがって、Bash、awk、Perl、またはその他のインタプリタを指定し、スクリプトの残りのファイルを適切な言語で作成できます。
通訳者に提示された主張含む単一オプションのパラメータスクリプトファイルの最初の行にインタプリタ名の後にスクリプトファイルの名前、続いて 残りの主張。 Bashは、これをデフォルトで処理しないオペレーティングシステムでこれを行います。一部の以前のバージョンのUnixでは、インタプリタ名と引数を最大32文字に制限しています。
「オプションのパラメータ」とは、オプションのパラメータ、または存在しても存在しなくてもよいパラメータを意味しますか?
なぜ「単一オプションパラメータ」なのか?複数の「オプションのパラメータ」を許可しませんか?
スクリプトが次のような場合
#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
...
Bashでスクリプトを実行するとき
$ myscript arg1 arg2 arg3
Bashで実行される実際のコマンドは何ですか?うん
$ /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 myscript arg1 arg2 arg3
ありがとうございます。
答え1
この場合、インタプリタの引数は、shebang行を解釈した後にスクリプト名と対応するコマンドライン引数と組み合わせて設定した引数です。
したがって、AWK スクリプトは次に終了します。
#! /usr/bin/awk -f
名前をつけてmyscript
呼んだ
./myscript file1 file2
結果は実際のパラメータです。
/usr/bin/awk -f ./myscript file1 file2
-f
これは単一のオプションのパラメータです。すべての通訳者が1つを要求するわけではなく(/bin/sh
例を参照)、多くのシステムは最大1つだけを許可します(したがって、shebang行は期待どおりに機能しません)。ただし、引数にはスペースを含めることができます。インタプリタの後のshebang行の全内容は単一の引数として渡されます。
shebang行を実験するには、次のように使用できます#! /bin/echo
(ただし、スペースが含まれている場合はパラメータを区別するのに役立ちません)。
バラよりプログラムの仕組みShebang行を処理する方法の詳細な手順(Linux上)
答え2
マンページを読んでくださいexecve(2)
。個々のオプションのパラメータの制限は、オペレーティングシステムによって異なります。 Linuxはインタプリタの後のすべての単語をパラメータとして扱います。
これを行うには、次のようにします。
#! /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
実際、あなたはこれをしなければなりません。
#!/bin/sh
exec /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2 "$@"
# ...................................................................................... ^^^^
env
アップデート:プログラムにこの目的のためのオプションがあることがわかりました-S
。 shebangになることができます(このプログラムを維持する必要がある場合は残念ですが)
#!/usr/bin/env -S /path/to/interpreter --opt1 opt1-arg --opt2 opt2-arg --opt3 nonopt-arg1 nonopt-arg2
マンページを読んでくださいenv(1)
。