スクリプトの上部にこの内容があります。
#!/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" "$@"
シェルラッパーを使用すると、環境変数の定義、使用可能なインタープリターのバージョンの検索など、より複雑なタスクを実行する機会が提供されます。
インタプリタの前に使用すると、exec
mochaスクリプトがシェルラッパーと同じプロセスで実行されるようになります。それ以外の場合は、exec
シェルに応じて子プロセスとして実行できます。これは、たとえばスクリプトにシグナルを送信する場合に重要です。
時には、ラッパースクリプトと実際のコードが同じファイルにあることがあります。多言語- 2つの異なる言語で有効なコードを含むファイル。多言語の作成は必ずしも簡単ではありませんが(または可能な場合もありますが)、2つの別々のファイルを管理および配布する必要がないという利点があります。これは、シェル部分がファイルでJSインタプリタを実行するJavaScript /シェル多言語プログラムです(JSインタプリタがshebang行を無視すると仮定し、そうでない場合は何もできません)。
#!/bin/sh
///bin/true; exec mocha --reporter=tap --output=foo "$0" "$@"
… (the rest is the JS code) …
答え2
フォローアップとしてザイルズの答え、これはスタンドアロンラッパーです。彼の2つの解決策が混在しています。 Gillesが言及した多言語スクリプト(メンテナンスと配布を必要とするスクリプト)の利点はありますが、欠点はありません(Gillesの言葉を引用すると、「多言語スクリプトを書くのは必ずしも簡単でも可能ではありません」)。
スクリプトの上部に数行を追加するだけです。
#!/bin/bash
exec mocha --reporter=tap --output=foo <(sed -n '/^#MOCHA_START#/,$ p' "$0")
#MOCHA_START#
....
....
(mocha script)
....
....
次の行は#MOCHA_START#
実際の mocha スクリプトであり、変更されません。最初の3行はmochaスクリプトを抽出し、そのスクリプトと必須パラメータを使用してmochaを呼び出します。
しかし、テキストエディタでファイルをMochaスクリプトとして解釈し、それに応じて色を付ける必要があるかもしれません。これは、スクリプトの最初の行(Bashスクリプトであることを示す)が混乱する可能性があるためです。
答え3
Shebangラインを使用することの欠点の1つは、#!/usr/bin/env
パラメータを渡すことができないことです。
ただし、インタプリタパスを使用している場合は、引数を渡すことができます。
#!/path/to/mocha --reporter=tap --output=foo
また見なさい:
答え4
現在これを行う方法を知っている唯一の方法は、環境変数を使用することです。したがって、私のハッシュバンには次のものがあります。
#!/usr/bin/env mocha
... mochaまたはすべての実行可能ファイルを許可する必要があります。環境変数、コマンドライン引数の代わりに正しく動作するようにします。
残念ながら、多くの実行ファイルは環境変数を使用しないため、これは非常に制限されているため、他のライブラリなどを呼び出す必要があるライブラリでは非常に困難です。