bashスクリプトを介して#!provide間接配信をどのように渡しますか?

bashスクリプトを介して#!provide間接配信をどのように渡しますか?

問題の説明が明確でない場合は申し訳ありません。

私は他の多くのスクリプトの動作を変更するために編集できるbashスクリプトが欲しいです。

たとえば、私は素晴らしいスクリプトを持っています。 Groovy ソルバー「groovy」を使用するか、「groovyclient」という特殊なランチャーを使用して実行できます。どちらが実行されるかを変更したい場合があります。あるいは、JavaクラスファイルにコンパイルしてJavaを使用して実行するなど、まったく異なる操作を実行したい場合があります。

したがって、シェルスクリプト/home/me/groovy/groovyrunという間接スクリプトがある場合は、次のようになります。

/usr/bin/groovy %*

または次のようになります。

/home/me/groovy/groovyclient $*

#やってみました!元のスクリプトの行は次のとおりです。

#!/home/me/groovy/groovyrun

そして、bashが呼び出されなかったので、groovyrunで何をすべきかわからなかったことにすぐに気づきました。

次に、次のことを試してください。

#!/bin/bash /home/me/groovy/groovyrun

しかし、今私の考えでは$ *

これは実行する必要がありますが、元の引数リストを取得するのに問題があると思います(呼び出したスクリプトの$ *が間違っている可能性があります)。

今、私はこれをどうするべきかわかりません。これが一般的なパターンかもしれないと思います。私はLinuxを理解するのに十分な(またはそれを見つける方法を知らないほど)Linuxに慣れていないので尋ねます。

#! を削除すれば簡単に解決でき、グルービースクリプトをシェルスクリプトに直接渡すことができますが、それは何が楽しいですか?

答え1

私が正しく理解したら、通過する間接的なレベルを作成したいと思います。シェルボーンスクリプト自体にはshebangを持つスクリプトがあります。Linuxはネストされたshebangを許可しますが、他のUnixバリアントは許可しません。。だからあなたは置くことができます

#!/home/me/groovy/groovyrun

Groovyスクリプトの上部に

#!/bin/sh

上に/home/me/groovy/groovyrun

ラッパースクリプト内で実行するには、次のものを使用groovyclientします。groovy

#!/bin/sh
if …; then
  exec groovyclient "$@"
else
  exec groovy "$@"
fi

"$@"スクリプトに渡された引数のリストをそのままコピーして表します(引数などの空白は正しく保存されます)。$*引数を中間スペースに連結する(groovyrun 'foo bar'に変質)を使用しないでくださいgroovyrun 'foo' 'bar'引用符なしで変数を拡張しないでください。。をexec参照してくださいラッパースクリプトでexecが必要な理由

答え2

スクリプトにshebangを指定すると機能しますgroovyrun

簡単な実験で、以下shell1を含むパッケージを作成します。

#!/bin/sh
echo shell1: "$@"
sh "$@"

そしてshell2包含

#!/.../shell1
echo shell2: "$@"

(正しいパスでshell1)実行するshell2 Helloと生成されます。

shell1: ./shell2 Hello
shell2: Hello

ご覧のとおり、各スクリプトに渡されたパラメータはどちらの場合も正しく表示されます。

関連情報