0

maven プラグイン appassemblyr を使用して UNIX スクリプトを生成しています。そのタグに、次のように sth を入れます。

<commandLineArguments>
  <commandLineArgument>$1</commandLineArgument>
  <commandLineArgument>$2</commandLineArgument>
  <commandLineArgument>$3</commandLineArgument>
</commandLineArguments>

ただし、結果のスクリプトは $1 $2 $3 "$@" を示しています。

最後の引数がどこから来たのかわからないため、最初の 3 つの引数を繰り返します。

4

1 に答える 1

0

MojoのAppAssemblerMavenプラグインは、スクリプトに提供されたすべてのコマンドライン引数を常にJVMの起動コマンドに追加するスクリプトを生成します。したがって、何もしなかった場合"$@"、プログラムの開始に使用されるJVMコマンドの最後になります。

この<commandLineArguments>タグは、ARGLISTマッチャーの前に追加のコマンドライン引数を挿入するために使用されます。

(私には)パラメーターを通過させるために位置マーカーを追加する必要があると思われるため、追加したスニペットです。それは両方です:

  1. デフォルトでは、プラグインは必要なすべてのパラメーターを渡すスクリプトを生成するため、不要です。
  2. 構成したものが引数の引用符とエスケープを正しく処理しないため、実際には潜在的なバグです。

2番目の点に関しては、2番目のパラメーターがスペース文字を含むファイルの名前である場合を考えてみてください。私があなたのためにスクリプトを起動すると、そのようにプログラムします

$ bin/foo.sh Document.txt Document\ 2.txt "Copy of Document 3.txt" Doc4.txt

実際には、指定した構成で次のものがJavaプログラムに渡されます。

  1. Document.txt(すべて$ 1)
  2. Document($ 2は拡張されますが、引用されていないため、再評価されます)
  3. 2.txt
  4. Copy($ 3は拡張されますが、引用符で囲まれていないため、再評価され、スペースは引数の区切り文字として再び表示されます)
  5. of
  6. Document
  7. 3.txt
  8. Document.txt(現在、ARGLISTマッチャーはすべてを正しく提供します)
  9. Document 2.txt
  10. Copy of Document 3.txt
  11. Doc4.txt

解決策は簡単です。構成する必要のないものを構成しようとするのはやめましょう。

于 2012-10-22T09:19:35.150 に答える