二重ハイフン(--)で始まるこのシャバンはどのように機能しますか?

二重ハイフン(--)で始まるこのシャバンはどのように機能しますか?

RosettaCodeページで、次の種類のshebangが見つかりました。

--() { :; }; exec db2 -txf "$0"

これはDb2だけでなくPostgresでも動作します。しかし、私はライン全体を理解していません。

デュアルダッシュはSQLのコメントであることがわかり、その後、DB2実行可能ファイルを呼び出し、ファイル自体をいくつかのパラメータを持つファイルに渡します。しかし、括弧、中括弧、コロン、セミコロンはどうですか?本物のシャーバン交換方法#! ?

https://rosettacode.org/wiki/Multiline_shebang#PostgreSQL

ベストアンサー1

関連:Shebangなしでスクリプトを実行するシェルインタプリタとは何ですか?

スクリプトにはshebang / hashbang /行がありません#!。ただ二重ダッシュがないからです#!

ただし、スクリプトはシェルによって実行され(上記の質問と回答を参照)、そのシェルの関数名に有効な-文字が含まれている場合、その行は--何もしないシェル関数を宣言します(実行します:何もしないでください)呼び出されません。

この関数はより一般的な複数行表記を使用します(より明確に見えるようにするために、奇妙な名前が実際に関数であるという事実を隠します)。

-- () {
  :
}

関数定義の唯一の目的は、有効なSQLコマンド(注釈)とともにシェルスクリプトに有効な行を含めることです。この種のコードを呼び出します。多言語

偽のシェル関数を宣言した後、スクリプトはシェルスクリプトインタプリタによって実行されると、現在のシェルをexec実行によって生成されたプロセスに置き換えます。これは、コマンドラインでスクリプトのパス名を使用するのと同じですdb2 -txf "$0"db2 -txf

このトリックは、Pythonシェル、Bourneシェル、またはPythonに基づくdash他のシェルを使用するシステムでは安定して動作しない可能性があります。これは、名前にダッシュを含む関数を許可しないためです。ashyashksh88ksh93/bin/sh

関連情報:


次もうまくいくと思います(実際にはテストしません)。

--() { exec db2 -txf "$0"; }; --

おすすめ記事