Ghostscript 옵션/플래그와 함께 변수를 사용하면 오류가 발생합니다.

Ghostscript 옵션/플래그와 함께 변수를 사용하면 오류가 발생합니다.

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}"

(그리고 큰따옴표는 필수입니다).

관련 정보