2011-05-05 54 views
1

我使用Java5的,我不想點CLASSPATH中的每一個.jar文件所以我試着寫小的shell腳本:Unix外殼:打開文件與目錄名「:」分隔的類路徑

find $LIB_DIR -name '*.jar' -print > /tmp/classpath 
CP= 
cat /tmp/classpath | while read line 
do 
CP=$CP:$line 
done 
rm -f /tmp/classpath 

但這是行不通的 - $ CP變量是空的。

結果$ CP應該是一個字符串與分隔pathes「:」

是任何人都知道這裏有什麼問題以及如何正確串接所有文件的行,將一個字符串?

回答

5

while循環是一個子shell,所以沒有變量將被傳遞迴主殼。無論如何,你想這樣做:

CP=$(find $LIB_DIR -name '*.jar' -print | tr '\n' ':') 

這會做你想要的所有在一行上。

+0

謝謝)這正是我需要的 – nahab 2011-05-05 13:07:16

+2

一個sed S /:$ //可以加入到刪除尾隨冒號。 – ceving 2011-05-05 13:08:30

+0

也許你可以把它標記爲正確的答案......在運行CP = $(find ../lib -name'* .jar'-print | tr'\ n'':'| sed s時給史蒂夫 – 2011-05-05 13:09:46

1

的問題是,在while循環在一個單獨的殼實例運行並在它的本地變量($CP)不可用在外殼上。

喜歡的東西

while read line; do 
    CP="$CP:$line" 
done < /tmp/classpath 

應該工作。但請注意,$CP以冒號作爲第一個字符結束,因此它需要一些後處理。

此外,您應該使用mktemp否則,如果有人在/tmp/classpath處插入符號鏈接,您可能會被騙入覆蓋文件。提到烏韋·克萊 - 柯尼希和史蒂夫·貝克

0

要清楚而-DO完成框不是由它的性質,但因爲在這個代碼塊

cat /tmp/classpath | while read line 
do 
CP=$CP:$line 
done 

Bash man page管使用子shell:「每管道中的命令作爲一個單獨的進程執行(即在一個子shell中)。「

更多subshells

another SO answer關於管道和子shell見。

enter link description here