1

以下はほとんど機能します:

#!/bin/bash
/* 2>&1 >/dev/null
script_dir=$(dirname "$0")

export GROOVY_HOME=${script_dir}/../../../../Tools/groovy/groovy-2.0.2

exec ${GROOVY_HOME}/bin/groovy -cp "${script_dir}:$(ls ${script_dir}/build/lib/runtime/*.jar | xargs echo | sed -e 's| |:|g')" "$0"
*/ // 2>&1 >/dev/null

println("aoeu")

唯一の問題は、シェルが/*をグロブして実行しようとすることです。結局、私が本当にやりたいのは、2つの別々のスクリプトを用意しなくても、Groovyスクリプトのクラスパスを作成できるようにすることです。

4

3 に答える 3

1

Groovy構文に依存しない(通常はで出力を生成しないstderr)以下の手法を試すこともできます。

#!/bin/sh
script_dir=$(dirname "$0")
export GROOVY_HOME="$script_dir/../../../../Tools/groovy/groovy-2.0.2"

awk 'mark_on{print}/^__END__$/{mark_on=1}' "$0" >/tmp/$$.groovy

"$GROOVY_HOME/bin/groovy" -cp "$script_dir:$(echo "$script_dir"/build/lib/runtime/*.jar | tr " " :)" /tmp/$$.groovy
status=$?

rm -f /tmp/$$.groovy

exit $status

__END__

println("aoeu")

クラスパス計算が単純化されていることにも注意してください。グロブ(ワイルドカード展開)は、引数を取るコマンドではなくシェルによって実行されるためls、この場合は使用する必要はありません(使用する必要もありません)。


${}この場合、元のコードの中括弧は技術的に不要です(純粋に文体です)。たとえば、変数の名前とそれに続くものの間に明確な区切りがない場合に、変数の置換の直後に文字列を追加する必要がある場合に必要になり$my_varsome_stringます。「最小限の」目的で、上記を説明するために中括弧を削除しましたが、スタイル上の理由から中括弧を保持することはまったく問題ありません。${my_var}some_string$my_var"some_string"$my_var'some_string'"$my_var"some_string"$my_var""some_string"

上記のコードで一貫して追加した引用符は、内部の潜在的な空白やその他の特定の特殊文字からユーザーを保護します$GROOVY_HOME$GROOVY_HOME空白が含まれないことがわかっている場合は、引用を単純化するために(そして最小限に抑えるために)、それらを自由に削除してください。

于 2012-11-09T01:31:34.503 に答える
0

Groovy / shell polyglot を書きたいようです。

groovy についてはわかりませんが、ドキュメントによると [] は有効な groovy コマンドであり、空のリストを作成しているようです。

次に、次のように記述できます。

#!/bin/bash
[ /*  2> /dev/null > /dev/null
script_dir=$(dirname "$0")

export GROOVY_HOME=${script_dir}/../../../../Tools/groovy/groovy-2.0.2

exec ${GROOVY_HOME}/bin/groovy -cp "${script_dir}:$(ls ${script_dir}/build/lib/runtime/*.jar | xargs echo | sed -e 's| |:|g')" "$0"
*/
    ]

println("aoeu")

Groovy は [] を読み取って無視し、bash は [ を /* で呼び出すため、無視されるエラーが発生します。ただし、予期しないプログラムは実行されません。

于 2012-11-09T01:39:39.770 に答える