exec 通过单引号中的空格终止命令

exec 通过单引号中的空格终止命令

我有一个简单的 bash 脚本,就像

#!/bin/bash
set -e
SPARK_CONF="--master ... \
...
--conf spark.driver.extraJavaOptions='-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps' \
--conf ...."
SPARK_CMD="spark-submit $SPARK_CONF"
echo $SPARK_CMD
exec $SPARK_CMD

我会收到一个错误

Error: Unrecognized option: -XX:+PrintGCDetails

我可以看到我在它之前打印了整个命令exec,所以我复制了打印的命令,然后粘贴到我的shell中,然后我发现它可以成功执行。

我尝试用单引号替换,\"但仍然出现相同的错误。

另外,如果我替换execeval,它也会起作用。我用谷歌搜索了它们之间的区别,但没有找到为什么 exec 会在引号内终止......

我只是想了解为什么exec在这种情况下会失败。

更新:根据https://unix.stackexchange.com/a/444949/524235,我将相关部分更改为

set -e -x

SPARK_CONF="--master ... \
...
--conf spark.driver.extraJavaOptions='-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps' \
--conf ...."
SPARK_CMD=($SPARK_HOME/bin/spark-submit $SPARK_CONF)
"${SPARK_CMD[@]}"

它仍然失败并出现上述相同的错误消息,但我可以看到执行的命令变为:

.../bin/spark-submit ...
--conf 'spark.driver.extraJavaOptions='\''-verbose:gc' -XX:+PrintGCDetails '-XX:+PrintGCDateStamps'\'''
...

我可以看到命令中添加了一些额外的单引号和反斜杠,我现在该如何进行?

相关内容