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

(そして二重引用符は必須です)。

関連情報