0

シェルスクリプトの習熟度を高めるために、プロジェクトをコンパイルするためにjavacへの適切な引数を生成するスクリプトを作成しました。

奇妙なことに、これは..スクリプトは完全に機能しますが、スクリプトがこれらのパラメーターを使用してjavacを実行すると機能せず、対話型シェルでまったく同じコマンドを実行すると機能します。すべてが絶対パスで出力されるので、ここではかなり途方に暮れています。

ディレクトリ構造の例:

src/File.java
src/File.png
src/dir/File2.java
jars/Library.jar

期待される出力:

build/File.class
build/File.png
build/dir/File2.class

シェルスクリプト:

#! /bin/sh

cwd=$(pwd)

if [ -d "build" ]; then
    rm -rf $cwd/build/*
else
    mkdir $cwd/build
fi

find $cwd/src \( ! -path '*/.*' \) -type f ! -iname "*.java" | xargs -I{} cp --parents {} $cwd/build

cmd=$(echo javac -sourcepath $cwd/src -classpath $(find $cwd/jars -type f | awk '{ printf("\"%s\";", $0);}'  | awk '{ print substr($0, 0, length($0)); }') -d $cwd/build $(find $cwd/src \( ! -path '*/.*' \) -type f -iname "*.java"))

$cmd
echo $cmd

コマンド出力:

javac -sourcepath /home/test/src -classpath "/home/test/jars/Library.jar" -d /home/test/build /home/test/src/File.java /home/test/src/dir/File2.java

私の実際のプロジェクトは大きすぎてここに投稿できませんが、基本的には、クラスパスが正しく設定されていないかのように、大量のエラー出力が表示されます(ライブラリ関数のエラーです)。echoステートメントからコマンドをコピーして貼り付け、Enterキーを押すと、完全に機能します。

理解できません。

何か案は?

4

2 に答える 2

6

一般に、コマンドをカットアンドペーストして機能させることができても、そのコマンドを実行しているときにシェルが機能しない場合は、どこかに引用符の問題があります。それが何であるかを理解しようとするのではなく、シェルに文字列を評価させるだけです。言い換えれば、代わりに:

$cmd

シェルが$cmdを直接入力したかのように評価するようにします。

eval $cmd
于 2012-09-10T23:03:54.070 に答える
1

引数を囲む引用符-classpathは、の値の一部であるため、文字通りに扱われます$cmd。展開された後は削除されず$cmd、結果の文字列はコマンドラインとして解析されます。コマンドラインで入力したかのようです

$ javac -sourcepath /home/test/src -classpath \"/home/test/jars/Library.jar\" -d /home/test/build /home/test/src/File.java /home/test/src/dir/File2.java
于 2012-09-10T22:22:02.160 に答える