bash脚本:-Xmx16M:未找到命令
我有一个通用的run-class.sh文件,定义如下: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
#!/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" "$@"
其他说明:
- 不要使用所有变量名,环境变量除外
- 阅读
#!/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" "$@"
其他说明:
- 不要使用所有变量名,环境变量除外
- 阅读
--foo“bar baz”
--如果您使用字符串来保存ARGS,则不可能将其作为单个单元。花点时间在BashFAQ页面上。什么意义上是健壮的?假设您的一个java参数包含一个空格,假设是--foo“bar baz”
--如果您使用字符串来保存参数,则不可能将其作为单个单元。花点时间在BashFAQ页面上。