다음 Z-쉘 스크립트가 있습니다.
compiler=clang++
standard=-std=c++11
warnings="-Wall -Wextra -Wpedantic"
${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp
${warnings} 변수가 세 개의 개별 경고 대신 공백이 포함된 하나의 긴 경고인 "-Wall -Wextra -Wpedantic"으로 처리되는 것처럼 보이기 때문에 이는 작동하지 않습니다.
몇 가지 검색을 수행한 결과 eval을 사용하여 작업할 수 있었습니다.
eval "${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp"
그러나 이것이 왜 필요한지, 그리고 이를 수정할 수 있는 다른 방법이 있는지 혼란스럽습니다.
편집: Peter O.의 답변에 표시된 대로 수행하는 것 외에도 다음을 수행할 수도 있음을 발견했습니다.
setopt shwordsplit
Z-shell이 다른 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"
답변2
$=
다음을 사용하여 변수를 분할 할 수도 있습니다 $IFS
.
${compiler} ${=warnings} ${standard} -o ${1} ${1}.cpp