web-dev-qa-db-ja.com

ラッパーシェルスクリプトからJavaアプリケーションに引数を渡す方法は?

Javaコマンドラインで作成しているプログラム(linuxおよびmac)を実行したい。「Java」と引数を常に入力したくないので、ラッパースクリプトを作成します。どこでも機能するようにこれを行うための最良の方法は何ですか?引数も渡せるようにしたいのですが、「シフト」を使用してこれを行う(最初の引数を削除する)ことを考えていました。

スクリプトをまったく使用せずにこれを行うより良い方法はありますか?おそらく、「Java」コマンドによる呼び出しを必要としない実行可能ファイルを作成しますか?

24
gonzobrains

Bourneシェルと互換性のあるシェルを使用していると仮定します。例えばsh、bash、kshなどの場合、次のラッパーはすべてのコマンドライン引数をJavaコマンドに渡します。

#!/bin/sh
OPTS=... 
Java $OPTS com.example.YourApp "$@"

$@は、シェルスクリプトの残りの引数に展開され、引用符で囲むことにより、引数が個別に引用されるため、次のように単一の引数がJavaに渡されます。

$ wrapper "/home/person/Stupid Directory Name/foo.txt" 

ラッパースクリプトで"$@"を二重引用符で囲まないと、Javaは上記の3つの引数を受け取ります。


これは"$*"では機能しないことに注意してください。 bash手動エントリによると:

"$*""$1c$2c..."と同等です。ここで、cIFS変数の値の最初の文字です。

つまり、すべてのシェル引数は、元のWordの境界を無視して、Javaアプリケーションの単一のコマンド引数に連結されます。

シェルが引用を処理する方法の詳細については、bashまたはshマニュアル...またはPOSIXシェル仕様...を参照してください。

45
Stephen C

シェルスクリプトを作成 することができます 引数を受け入れます 。シェルスクリプトでは、次のようになります。

Java YourApp $1 $2

この場合、YourAppは2つの引数を受け入れます。シェルスクリプトがapp.shと呼ばれる場合、次のように実行できます:-

./app.sh FirstArgument SecondArgument 
6
limc