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

bash脚本:-Xmx16M:未找到命令,bash,shell,sh,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

我有一个通用的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
和另一个test-class.sh脚本,如下所示,用于调用java类:

#!/bin/bash
MAIN_CLASS="com.my.package.TestClass"

. run-class.sh
当我运行test-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
我收到一条安慰信息说:

run-class.sh: line 8: -Xmx16M: command not found

当我已经导出JAVA_参数时,我不确定为什么这是不正确的。

在JAVA_参数赋值中使用引号:

JAVA_ARGS="-client -Xmx16M"

在JAVA_ARGS赋值中使用引号:

JAVA_ARGS="-client -Xmx16M"

可以设置本地化为命令的变量。 大多数人都知道简单的环境变量,设置如下-

$: x=foo
$: echo $x
foo
但您可以设置本地覆盖

$: x=bar eval 'echo $x' # <<--- uses echo's local x
bar
$: echo $x
foo
…如果您没有意识到echo在解析该行时收到了该值,因此没有看到更改,则会使您感到困惑。)

所以说

JAVA_ARGS=-client -Xmx16M
如果没有引号,命令解释器将假定这就是您正在执行的操作,并且由于未找到
-Xmx16M
而失败。通过在其周围加引号,可以使整个值成为赋值的一部分

JAVA_ARGS='-client -Xmx16M'

这将满足您的需要。

您可以设置本地化为命令的变量。 大多数人都知道简单的环境变量,设置如下-

$: x=foo
$: echo $x
foo
但您可以设置本地覆盖

$: x=bar eval 'echo $x' # <<--- uses echo's local x
bar
$: echo $x
foo
…如果您没有意识到echo在解析该行时收到了该值,因此没有看到更改,则会使您感到困惑。)

所以说

JAVA_ARGS=-client -Xmx16M
如果没有引号,命令解释器将假定这就是您正在执行的操作,并且由于未找到
-Xmx16M
而失败。通过在其周围加引号,可以使整个值成为赋值的一部分

JAVA_ARGS='-client -Xmx16M'

这将满足您的需要。

我发现使用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" "$@"
其他说明:

  • 不要使用所有变量名,环境变量除外
  • 阅读

我发现使用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" "$@"
其他说明:

  • 不要使用所有变量名,环境变量除外
  • 阅读

Try JAVA_ARGS=“-client-Xmx16M”Try JAVA_ARGS=“-client-Xmx16M”在什么意义上是健壮的?假设您的一个JAVA arg包含一个空格,假设
--foo“bar baz”
--如果您使用字符串来保存ARGS,则不可能将其作为单个单元。花点时间在BashFAQ页面上。什么意义上是健壮的?假设您的一个java参数包含一个空格,假设是
--foo“bar baz”
--如果您使用字符串来保存参数,则不可能将其作为单个单元。花点时间在BashFAQ页面上。