我有一个简单的 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中,然后我发现它可以成功执行。
我尝试用单引号替换,\"
但仍然出现相同的错误。
另外,如果我替换exec
为eval
,它也会起作用。我用谷歌搜索了它们之间的区别,但没有找到为什么 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'\'''
...
我可以看到命令中添加了一些额外的单引号和反斜杠,我现在该如何进行?