次の単純な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'\'''
...
コマンドに一重引用符とバックスラッシュが追加されていることがわかります。今どうやって進むべきですか?