bash脚本:-Xmx16M:找不到命令

时间:2018-11-15 16:50:22

标签: bash shell sh

我有一个通用的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时为什么不正确。

3 个答案:

答案 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'

这会做您想要的。