2016-09-01 5 views
2

私はさまざまな他のシェルスクリプトで定義された関数を呼び出すマスターシェルスクリプトを持っています。マスタースクリプトには、 'source'コマンドを使用する他のスクリプトが含まれています。 彼女のスクリプト( "#!/ bin/sh")に何が設定されているかにかかわらず、すべてのスクリプトに共通のインタプリタを使用したいと思います。私はコマンドラインからその通訳を提供したい。例えば :(#!/ binに/ shを持つ)シェルスクリプトでsha bangインタプリタを再帰的にオーバーライドする方法はありますか?

master.sh(#/ binに/ shを持つ!)

subscript1.sh

subscript2.sh(と#/ binに/!添字で定義されていると 'ソースsubscript1.sh'、 'ソースsubscript2.sh' として含まれている関数を呼び出しmaster.sh SH)

subscript3.sh(#付き!/ binに/ SH)

と 'source subscript3.sh'です。

./master.shを実行すると、サブスクリプトはそれぞれのインタプリタを "#!/ bin/sh"の指示に従って使用します。私は '/ bin/bash'、マスターとサブスクリプトを使ってすべてを実行したいのですが、そのようなスクリプトがたくさんあるので、彼女のバングラインを変更することはありません。これを行う方法はありますか?

答えて

4

は、明示的にインタプリタを呼び出します。

bash ./master.sh 

注意をシェバングラインはスクリプトsourceを使用して実行に影響を与えないこと。このコマンドは現在のシェルプロセスで常にスクリプトを実行するため、現在実行されているインタープリタを使用します。

しかし、これはすべて危険なようです。もし誰かが#!/bin/bashの代わりに#!/bin/shと書くと、代わりにbashが使用された場合、違反するshの構文に依存することがあります。

+0

答えてくれてありがとう、Barmar。しかし、私はそれをやってみましたし、それは動作しません。私は、彼女が行を立てるという考えは、どのプロセスやシェルがスクリプトを起動するかにかかわらず、定義されたインタプリタを使うことだったと思います。私は確かにこれを明確にする必要があります。 – Navin

+0

それはシバンの仕組みではありません。インタプリタへの入力ファイルではなく、コマンドとして実行する場合、カーネルにスクリプトの実行方法を指示します。 – Barmar

+0

'bash。/ master.sh'は' cat/master.sh'とまったく同じです。両方とも指定されたコマンドを実行し、引数としてファイル名を指定します。 'bash'はファイルを解釈し、' cat'はファイルを出力します。 – Barmar

関連する問題