我使用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应为单个字符串,并用':'
分隔有谁知道这里有什么问题以及如何正确地将所有文件的行连接到一个字符串?
答案 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关于管道和子壳。