以破折号开头的表达式在 shell 赋值中意味着什么?

以破折号开头的表达式在 shell 赋值中意味着什么?

我尝试在脚本文件中使用 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 --posixls --format=long。为什么要破折号?历史惯例。应该注意的是,POSIX 标准只需要简短版本的命令行参数。

相关内容