我尝试在脚本文件中使用 JAVA_OPTS=-Xms1024m -Xmx1024m ... 。它显示类似“-Xmx1024m:命令未找到”的错误。
用双引号或单引号引用赋值后,错误消失。
我发现错误是由第一个破折号引起的。因为像“a=-bb xx yy ...”这样的所有赋值都会引发相同的错误:它尝试将 xx 作为程序运行。如果第一个单词以破折号开头,并且赋值表达式中没有引号,那么 shell 似乎会将第二个单词识别为命令。
所以我的问题是:以破折号开头的赋值表达式在 shell 中意味着什么?我默认使用 bash。
答案1
首先,你确实应该引用你的变量:
JAVA_OPTS="-Xms1024m -Xmx1024m"
由于变量未加引号,因此在原始命令中仅JAVA_OPTS=-Xms1024m
被解释为变量赋值和-Xmx1024m
命令名称。这通常称为为命令设置环境变量。例如,
LC_ALL=C date +%s
将使用date
设置修改 的环境LC_ALL=C
(即date
以英语语言环境运行,即使您设置了其他内容)。请注意此处的区别 - LC_ALL=C 没有空格,因此不会发生分词,这就是在以下情况下发生的情况JAVA_OPTS=-Xms1024m -Xmx1024m
其次,破折号表示选项的简短样式。还有长样式,例如bash --posix
或ls --format=long
。为什么要破折号?历史惯例。应该注意的是,POSIX 标准只需要简短版本的命令行参数。