重複する可能性がありますが、問題が解決されていない元の質問に対する回答が見つかりました。
質問を書き直しました。
このJavaアプリケーションがあります。
public static void main(final String[] args) {
System.out.println("DEBUG: arguments passed to the main - " + Arrays.toString(args));
System.exit(new TaskRunner().run(args));
}
2つのパラメータを使用してコードを直接呼び出す場合:
$ nohup ${JAVA_HOME}/bin/java -cp /opt/fxudply/fxcal-client-jar/current/lib:/opt/fxudply/fxcal-client-jar/current/lib/*:/opt/fxudply/fxcal-config/current/wib-config:/opt/fxudply/fxcal-config/current/wib-config/* wib.runner.TaskRunner -taskExtRef "QUOTES_UPLOAD IPV - EOD Rates Input - Commodities Volatilities" > /opt/sw/calypso/logs/taskrunner/log.direct.log 2>&1
それは印刷する
[TaskRunner] DEBUG: : arguments passed to the main - [-taskExtRef, QUOTES_UPLOAD IPV - EOD Rates Input - Commodities Volatilities]
これがまさに私が期待したものです。しかし、このシェルスクリプト()を書くとstartScheduledTask.sh
:
NOW_DATE=`date '+%Y%m%d%H%M%S'`
nohup ${JAVA_HOME}/bin/java -cp some:classpath:values package.name.classname "$@" > /opt/random/path/tplogs/classname/${aVariableLogName}.${NOW_DATE}.log 2>&1
次のように実行します。
$ ./startScheduledTask.sh -taskExtRef "QUOTES_UPLOAD IPV - EOD Rates Input - Commodities Volatilities" &
私は次のような結果を得ます。
[TaskRunner] DEBUG: : arguments passed to the main - [-taskExtRef, QUOTES_UPLOAD, IPV, -, EOD, Rates, Input, -, Commodities, Volatilities]
(つまり、2番目の引数には8つのスペースが含まれているため、9つの引数に分けられます。)だから、スクリプトに問題があると思います。
どうすれば解決できますか?
答え1
シェルはコマンドラインを解析するときに引用符を削除しますが、それが示唆するテキスト構造は覚えています。 (これは過度に単純化したものです。大きな打撃(1)またはシェルコマンド言語詳しくはこちらをご覧ください。 )たとえば、コマンドライン入力
-blah apple -secondfruit "green banana" -some more
シェルに6つの単語またはトークンを認識させる。
-blah
apple
-secondfruit
green banana
-some
more
メモリに保存されます。
-blahⓧappleⓧ-secondfruitⓧgreen bananaⓧ-someⓧmoreⓧ
これはⓧ
ヌルバイトを表します。時には、次のように表示または報告されます。
-blah apple -secondfruit green banana -some more
したがって、引用符は無視され、7つの単語しかないと思うかもしれませんが、実際には何が欲しいのですか?
メモ:
上記の式では、は
ⓧ
ヌルバイトを表します。私がここで説明しているのは基準シェルパラメータの解析処理。入力したらls -l fruit.sh "I came here for an argument" startScheduledTask.sh
/bin/ls
文字列を使用したプログラムの呼び出しlsⓧ-lⓧfruit.shⓧI came here for an argumentⓧstartScheduledTask.shⓧ
記憶上ではこう解釈される。
- 引数[0] =
ls
- 引数[1] =
-l
- 引数[2] =
fruit.sh
- 引数[3] =
I came here for an argument
- 引数[4] =
startScheduledTask.sh
これまったく同じプロセスあなたならそのようなことが起こるでしょう
java
デフォルトの対話型シェルに直接コマンドを入力します。java
シェルスクリプトでコマンドを実行する./startScheduledTask.sh
デフォルトの対話型シェルに直接コマンドを入力して、シェルスクリプトを実行します。だからこれは問題ではありません。 引数がヌル文字で区切られた引数を処理できないすべてのプログラム UnixとLinuxでは動作しません。
長い話を短く
最初のコマンドは正しいです。 "$@"
欲しいものを提供します。これは、シェルスクリプトが呼び出すプログラムに引数を渡す正しい方法です。引数を繰り返すためにプログラムにデバッグコードを追加し、各引数を新しい行および/または括弧内に印刷すると(すべて1行には表示されず、空白で区切られます)、プログラム"$@"
に6つのパラメータが表示されます。
まあ、もっとあります:
クラスパスにはアスタリスク(
*
s) 中ですか?本当に?私はJavaに初めて触れましたが、これは奇妙に見えます。システムがこれを正しく実行していることを再確認してください。ただし、アスタリスクのあるクラスパスを「直接」(つまり、デフォルトのシェル、デフォルトのインタラクティブシェル、ログインシェルに直接)入力すると正常に動作します。おそらく問題ではない。しかし、とにかく私をユーモラスに表現し、その文字列を引用符で囲んでください。
あなたの質問は複雑すぎます。飛行機を作るとき、飛行機全体を作ってから飛ばそうとするものではありません。そうすれば、飛行機が飛んでいないときに戻って「飛行機に何の問題がありますか?」と尋ねません。いいえ、塊でテストします。単純化する必要があります。
- バックグラウンドで実行を停止します。
- 言わないで
nohup
。 - 出力リダイレクトを停止します。
- 質問に42文字の長いシェルプロンプトを表示しないでください。
- あなたの問題は~について1つのパラメータにはスペースが含まれているため、削除しないでください。ただし、長さが60文字でスペースが8つである必要はありません。
green banana
はすごいテスト値。 - プログラムのパラメータを試してください。いいえによって。 。 。スタート
-
(スプリント)。 new TaskRunner().run(args)
DEBUGとSystem.exit(0);
。
どちらもありませんしなければならない変化を作ります。しかし、注意が気を散らし、重要なことが何であるかを理解するのは難しいかもしれません。最小限のテスト構成で問題を実証できる場合は、問題に関連する他のすべてを除外できます。ただし、関連性のないコンテンツを削除しても問題が解決した場合は、次のいずれかで問題が発生した可能性があります。
また、質問に偽/テストデータと実際のデータ(果物や仕事など)を混在させないでください。
次のスクリプトを書いてください(と呼んでください
fruity.sh
)。#!/bin/sh # classpath CP="/opt/fxudply/fxcal-client-jar/current/lib:/opt/fxudply/fxcal-client-jar/current/lib/*:/opt/fxudply/fxcal-config/current/wib-config:/opt/fxudply/fxcal-config/current/wib-config/*" # package.name.classname PC=wib.runner.TaskRunner "$JAVA_HOME"/bin/java -cp "$CP" "$PC" "$@"
そして走る
./fruity.sh taskExtRef "green banana"
デバッグが言うなら
…[taskExtRef, green banana]
うまく
"$@"
動作しますが、問題はスクリプトの他の場所にあります。それを探してください。一度に1つずつ変更し、動作がどのように変わるかを確認してください。あなたがそれを理解することができなければ、私たちはあなたを助けることができます。しかし、あなたが私たちにスクリプトの一部を表示する場合にのみ可能です。~につながる質問。しかし、デバッグが言うなら
…[taskExtRef, green, banana]
もしそうなら、私たちに教えてください。