1

我使用 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 应该是单个字符串,路径由 ':' 分隔

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

4

3 回答 3

5

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

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

这将在一条线上完成您想要的所有操作。

于 2011-05-05T12:59:41.903 回答
1

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

就像是

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

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

此外,您应该使用,mktemp否则如果有人将符号链接放在/tmp/classpath.

于 2011-05-05T13:09:59.800 回答
0

为了明确指出,Uwe Kleine-König 和 Steve Baker while-do-done 块本质上不是 subshel​​l,而是因为在此代码块中使用了管道

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

来自Bash 手册页:“管道中的每个命令都作为单独的进程执行(即,在子 shell 中)。”

更多关于子壳

另请参阅有关管道和子壳的另一个 SO 答案。

在此处输入链接描述

于 2011-05-06T08:55:41.247 回答