我有一个通用的run-class.sh文件,定义如下:
#!/bin/bash
if [ -z "$MAIN_CLASS" ] ; then
echo "Do not run this script on its own. It's intended to be included in other commands."
exit 1
fi
JAVA_ARGS=-client -Xmx16M
export JAVA_ARGS
DIR=`dirname "$0"`
# set jars
JARS=
for JAR in $DIR/../lib/*.jar; do JARS=$JAR:$JARS; done
# set java classpath and export
CLASSPATH=$DIR/../conf/:$DIR/../conf/*:$JARS
export CLASSPATH
java $JAVA_ARGS $MAIN_CLASS "$@"
和另一个test-class.sh脚本,如下所示以调用Java类:
#!/bin/bash
MAIN_CLASS="com.my.package.TestClass"
. run-class.sh
当我按如下方式运行test-class.sh文件时:
>./test-class.sh
我收到一条控制台消息,说:
run-class.sh: line 8: -Xmx16M: command not found
我不确定在导出JAVA_ARGS时为什么不正确。
答案 0 :(得分:3)
使用带有JAVA_ARGS分配的引号:
JAVA_ARGS="-client -Xmx16M"
答案 1 :(得分:1)
我发现使用bash数组往往会使事情变得更健壮:
#!/bin/bash
if [ -z "$MAIN_CLASS" ] ; then
echo "Do not run this script on its own. It's intended to be included in other commands."
exit 1
fi
# use an array
java_args=(-client -Xmx16M)
dir=$(dirname "$0")
# set java classpath and export
cp=(
"$dir"/../.conf/
"$dir"/../.conf/"*" # I assume you want a literal star here
"$dir"/../lib/*.jar
)
export CLASSPATH=$( IFS=":"; echo "${cp[*]}" )
java "${java_args[@]}" "$MAIN_CLASS" "$@"
其他说明:
答案 2 :(得分:0)
您可以设置本地化为命令的变量。 大多数人都知道像这样设置的简单环境变量-
$: x=foo
$: echo $x
foo
但是您可以设置本地替代。
$: x=bar eval 'echo $x' # <<--- uses echo's local x
bar
$: echo $x
foo
(不要被错误的测试所愚弄...
$: x=bar echo $x # $x parsed BEFORE passing to echo
foo
...如果在解析行时没有意识到echo会收到 value ,那么这会让您感到困惑,因此看不到更改。)
所以,说
JAVA_ARGS=-client -Xmx16M
不带引号,命令解释器假定这就是您正在执行的操作,但由于未找到-Xmx16M
而失败。通过在其两边加上引号,可以使整个值成为分配的一部分。
JAVA_ARGS='-client -Xmx16M'
这会做您想要的。