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ので、印刷されたコマンドをコピーしてシェルに貼り付け、正常に実行できることを発見しました。

一重引用符に置き換えようとしましたが、\"まだ同じエラーが発生しました。

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'\'''
...

コマンドに一重引用符とバックスラッシュが追加されていることがわかります。今どうやって進むべきですか?

関連情報