問題の説明が明確でない場合は申し訳ありません。
私は他の多くのスクリプトの動作を変更するために編集できる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
ご覧のとおり、各スクリプトに渡されたパラメータはどちらの場合も正しく表示されます。