PDF 파일의 생성/작동을 스크립팅하고 있으므로 gs
(Ghostscript)를 사용하고 있습니다. 내가 겪고 있는 문제는 변수를 옵션으로 사용하면 gs
오류가 발생한다는 것입니다.
내가 사용하는 유효한 명령은 다음과 같습니다.
gs -sDEVICE=pdfwrite -dCompatabilityLevel=1.4 -dPDFSETTINGS=/printer -dNOPAUSE -dQUIET -dBATCH -sOutputFile="${ofile}" "${tfile}"
필요에 따라 더 쉽게 보고 편집할 수 있도록 이러한 옵션을 변수에 할당했습니다.
local gsOPTS="-sDEVICE=pdfwrite -dCompatabilityLevel=1.4 -dPDFSETTINGS=/printer"
local gsFLAGS="-dNOPAUSE -dQUIET -dBATCH"
gs "${gsOPTS}" "${gsFLAGS}" -sOutputFile="${ofile}" "${tfile}"
이렇게 하면 gs
오류가 발생합니다.Unknown device: pdfwrite -dCompatabilityLevel=1.4 -dPDFSETTINGS=/printer
변수를 따옴표로 묶으려고 했지만 더 이상 검색하지 않았습니다. 변수를 사용하지 않으면 정상적으로 작동합니다. 나는 항상 이 기술(예: FFMPEG 사용)을 아무 문제 없이 사용해 왔습니다. gs
이 문제의 특별한 원인이 있습니까 ?
저는 macOS 10.15.6, Zsh 버전 5.7.1 및 gs
버전 9.52를 실행하고 있습니다.
답변1
"${gsOPTS}"
값을 gsOPTS
단일 매개변수로 전달합니다. 그러나 여기에는 gsOPTS
단일 인수가 포함되어 있지 않습니다. 공백으로 연결된 인수 목록이 포함되어 있습니다.
${gsOPTS}
그다지 좋지는 않습니다. sh 및 bash와 같은 쉘에서는 값이 공백으로 분할되고 다른 중요한 특수 문자가 없기 때문에 귀하의 경우에는 잘 작동합니다. 그러나 zsh에서는 ${gsOPTS}
이러한 분할이 발생하지 않습니다.
단일 매개변수가 아닌 매개변수 목록을 포함 하므로 gsOPTS
문자열이 아닌 문자열 목록이어야 합니다. 이는 zsh에서 쉽게 수행할 수 있습니다. 목록을 배열이라고 합니다.문자열 배열기동이 매우 쉽습니다.
local gsOPTS=(-sDEVICE=pdfwrite -dCompatabilityLevel=1.4 -dPDFSETTINGS=/printer)
local gsFLAGS=(-dNOPAUSE -dQUIET -dBATCH)
gs ${gsOPTS} ${gsFLAGS} -sOutputFile="${ofile}" "${tfile}"
기술적으로 ${gsOPTS}
(또는 ${gsOPTS}
이에 상응하는) 것은 "배열의 요소 연결"이 아니라 "배열의 비어 있지 않은 요소 연결"을 의미합니다. 아마도 여기서는 중요하지 않을 것입니다. 그러나 빈 요소를 유지하려면 다음이 필요합니다.
gs "${(@)gsOPTS}" "${(@)gsFLAGS}" -sOutputFile="${ofile}" "${tfile}"
또는
gs "${gsOPTS[@]}" "${gsFLAGS[@]}" -sOutputFile="${ofile}" "${tfile}"
또는
gs "$gsOPTS[@]" "$gsFLAGS[@]" -sOutputFile="${ofile}" "${tfile}"
(그리고 큰따옴표는 필수입니다).