Unix shell:将带有目录名的文件转换为':'分隔的classpath

时间:2011-05-05 12:55:05

标签: java shell unix java-5

我使用Java5,我不想在Classpath中指出每个.jar文件,所以我尝试编写小的shell脚本:

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应为单个字符串,并用':'

分隔

有谁知道这里有什么问题以及如何正确地将所有文件的行连接到一个字符串?

3 个答案:

答案 0 :(得分:5)

您的while循环位于子shell中,因此不会将任何变量传递回主shell。无论如何你想做这样的事情:

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

那将在一条线上做你想要的一切。

答案 1 :(得分:1)

问题是while循环在一个单独的shell实例中运行,其中的局部变量($CP)在外壳中不可用。

这样的东西
while read line; do
    CP="$CP:$line"
done < /tmp/classpath

应该有效。但请注意,$CP最后以冒号作为第一个字符,因此需要进行一些后处理。

此外,您应该使用mktemp否则,如果有人在/tmp/classpath添加符号链接,您可能会被欺骗覆盖文件。

答案 2 :(得分:0)

要清楚说明Uwe Kleine-König和Steve Baker的do-do-done块本质上不是子壳,而是因为在这个代码块中使用了管道

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

Bash man page:“管道中的每个命令都作为一个单独的进程执行(即在子shell中)。”

有关subshells的更多信息。

另见another SO answer关于管道和子壳。

enter link description here