hashbangまたは他の場所でファイルを実行する方法に関する追加の手順が含まれています。

hashbangまたは他の場所でファイルを実行する方法に関する追加の手順が含まれています。

スクリプトの上部にこの内容があります。

#!/usr/bin/env mocha

ほとんどの人が知っているように、これはスクリプトの実行に使用する実行可能ファイルをオペレーティングシステムに伝えます。

しかし、私の質問は - スクリプトの実行方法に関する追加情報をmocha実行可能ファイルにどのように含めることができるかです。

Mochaにはオプションのパラメータが必要なので、次のようにしたいと思います。

#!/usr/bin/env mocha --reporter=tap --output=foo

しかし、私はこれが許されないと思います。

ファイルの実行方法に関する詳細情報をmocha実行可能ファイルに提供するにはどうすればよいですか?

ベストアンサー1

これシェルボーン行はカーネルによって解釈され、それほど柔軟ではありません。 Linuxでは、単一の引数に制限されます。構文は#!、オプションのスペース、インタプリタパス(スペースなし)、オプションのスペース、およびオプションの単一引数(開始部分を除いてスペースを含めることができます)です。さらに、合計シェバンラインサイズは128バイトに制限されています(BINPRM_BUF_SIZEカーネルソースコードの定数load_script)。

複数のパラメータを渡すには回避策が必要です。パス拡張を使用している場合は、#!/usr/bin/envコマンド名のスペースだけがあり、他のパラメーターはありません。

最も明確な解決策は、スクリプトをラップすることです。モカコードを含める代わりに、/path/to/my-scriptモカコードを別のファイルに入れて小さなシェルスクリプトを/path/to/my-script.real作成することができます。/path/to/my-script以下は、実際のコードがスクリプトと同じ名前のファイルにあり、.real最後に追加されていると仮定するラッパーの例です。

#!/bin/sh
exec mocha --reporter=tap --output=foo "$0.real" "$@"

シェルラッパーを使用すると、環境変数の定義、使用可能なインタープリターのバージョンの検索など、より複雑なタスクを実行する機会が提供されます。

インタプリタの前に使用すると、execmochaスクリプトがシェルラッパーと同じプロセスで実行されるようになります。それ以外の場合は、execシェルに応じて子プロセスとして実行できます。これは、たとえばスクリプトにシグナルを送信する場合に重要です。

時には、ラッパースクリプトと実際のコードが同じファイルにあることがあります。多言語- 2つの異なる言語で有効なコードを含むファイル。多言語の作成は必ずしも簡単ではありませんが(または可能な場合もありますが)、2つの別々のファイルを管理および配布する必要がないという利点があります。これは、シェル部分がファイルでJSインタプリタを実行するJavaScript /シェル多言語プログラムです(JSインタプリタがshebang行を無視すると仮定し、そうでない場合は何もできません)。

#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …

おすすめ記事