SH/BASH: 変数にスペースを含むコマンド・パラメーターを保管します。

SH/BASH: 変数にスペースを含むコマンド・パラメーターを保管します。

後で実行するためにコマンド文字列を変数に保存しようとしています。問題は、コマンドにスペースを含むパラメータ引数が含まれていることです。コマンドを実行すると、シェルは引数を単一の文字列として扱わず、二重引用符文字を含む2つの文字列として解釈します。

例:

$ CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"

$ ${CMD_CMAKE}
CMake Error: Could not create named generator "MSYS

コマンドを-G "MSYS Makefiles"渡す必要があります。cmake逆に、-G \"MSYSそしてMakefiles\"通過しています。

私は成功せず、次のすべてを試しました。

$ CMD_CMAKE='cmake -G "MSYS Makefiles" ../../source/poppler-0.79/'

$ CMD_CMAKE="cmake -G 'MSYS Makefiles' ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\ Makefiles ../../source/poppler-0.79/"

$ CMD_CMAKE="cmake -G MSYS\\ Makefiles ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G ${GEN} ../../source/poppler-0.79/"

$ GEN="MSYS Makefiles" && CMD_CMAKE="cmake -G \"${GEN}\" ../../source/poppler-0.79/"

$ CMD_CMAKE=$(echo "cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/")

$ CMD_CMAKE=$(echo 'cmake -G "MSYS Makefiles" ../../source/poppler-0.79/')

Google でいくつかの検索を行いましたが、回答が見つかりませんでした。たぶん私は正しい用語を使用していないので、それは可能性があります。

編集する: 申し訳ありません。この質問をstackoverflow.comに投稿する必要があると思いました。

答え1

この解決策を見つけるのを助けてくれたjesse_bとKusalalanandaに感謝します。

実は本当に簡単です。コマンドと引数を保存するには、配列に入れてすべての引数を二重引用符で囲み、スペースで囲みます。

CMD_CMAKE=(cmake -G "MSYS Makefiles" ../../source/poppler-0.79/)

これを実行するには、変数を二重引用符で囲む必要があります。

"${CMD_CMAKE[@]}"

frabjousが言及した別の解決策は、次のコマンドを使用することですeval

CMD_CMAKE="cmake -G \"MSYS Makefiles\" ../../source/poppler-0.79/"
eval ${CMD_CMAKE}

関連情報