2012-09-10 235 views
0

我編寫了一個腳本,該腳本可以生成適當的參數給javac編譯我的項目,以便更加精通shell腳本。命令在交互式shell中運行,但不在shell腳本中運行

奇怪的是這個腳本完美地工作,但是如果腳本運行帶有這些參數的javac,它就不起作用,並且如果我在交互式shell中運行相同的命令,它會執行相同的命令。所有東西都是以絕對路徑輸出的,所以我在這裏幾乎不知所措。

實施例的目錄結構:

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語句複製該命令,請將其粘貼,然後按回車鍵完成。

我不明白。

任何想法?

回答

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 
5

在一般情況下,隨時可以切正粘貼命令,並使其發揮作用,但是當它運行該命令的外殼不工作,有一個在某處引用問題。而不是試圖找出它是什麼,只是讓殼評估字符串。換句話說,而不是,:

$cmd 

你想要的外殼,以評估$在cmd就好像您已直接鍵入它:

eval $cmd