シェルスクリプトの習熟度を高めるために、プロジェクトをコンパイルするために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キーを押すと、完全に機能します。
理解できません。
何か案は?