次のZシェルスクリプトがあります。
compiler=clang++
standard=-std=c++11
warnings="-Wall -Wextra -Wpedantic"
${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp
$ {warnings}変数は、3つの別々の警告の代わりにスペースを含む1つの長い警告、「-Wall -Wextra -Wpedantic」として扱われるように見えるため、これは機能しません。
いくつかの検索を行った結果、evalを使って作業することができました。
eval "${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp"
しかし、これがなぜ必要なのか、そしてそれを修正する他の方法があるのか混乱しています。
編集:Peter O.の答えに示されているように実行することに加えて、次のこともできることがわかりました。
setopt shwordsplit
Zシェルを他のBourneシェル派生のように振る舞うようにします。彼らのようにFAQで言う:
ほとんどのBourne-shell派生語では、マルチワード変数です。
var="foo bar"
コマンドに渡されるとき、またはfor foo in $ varループで使用されるときに単語に分割されます。デフォルトでは、zshにはこれらの動作はありません。変数は変更されていません。 (これはバグではありません!以下を参照してください。)SH_WORD_SPLITオプションは互換性のために存在します。
ベストアンサー1
警告オプションを配列に設定します。"${warnings[@]}"
3人作成性格
warnings=(-Wall -Wextra -Wpedantic)
"${compiler}" "${warnings[@]}" "${standard}" -o "${1}" "${1}.cpp"
または、より読みやすいと思われる場合は、「なしで配列を作成してから、コマンドライン-W
から-W
配列をレンダリングして」を追加できます。
warnings=( all extra pedantic )
"${compiler}" "${warnings[@]/#/-W}" "${standard}" -o "${1}" "${1}.cpp"