私は1989年以来、コマンドラインから1行のbashスクリプトを書いてきました。これらのスクリプトの形式は通常次のとおりです。
for name in 1 2 3; do wc $name.txt; done
私は2つのファイル名をパラメータとして使用するスクリプトを使用して、GIMPを使用していくつかの画像処理を実行しようとしています。有効なコマンドラインを提供する内容は次のとおりです。
/Applications/GIMP.app/Contents/MacOS/GIMP -b '(script-fu-overlay "png0004.tif" "png0000.tif") (script-fu-overlay "png0004.tif" "png0001.tif") (script-fu-overlay "png0004.tif" "png0002.tif") (script-fu-overlay "png0004.tif" "png0003.tif")'
これは、一般的なシングルライナーの助けを借りて作成されます。
X=\'$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)\'
しかし…私の質問はこんな感じです。
echo /Applications/GIMP.app/Contents/MacOS/GIMP -b $X
上記の正確なコマンドラインを提供しますが、実行すると
/Applications/GIMP.app/Contents/MacOS/GIMP -b $X
引用符でファイル名を開くことができないというエラーが発生しますが、実行すると
/Applications/GIMP.app/Contents/MacOS/GIMP -b "$X"
すべてが正常です。私の実際の目標は、変数をまったく使用せずに1行のステートメントを作成できることを確認することです。それは次のとおりです。
/Applications/GIMP.app/Contents/MacOS/GIMP -b \'$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)\'
しかし、これは明らかに同じ方法で失敗します
/Applications/GIMP.app/Contents/MacOS/GIMP -b $X
失敗する。
ベストアンサー1
はい、シェル変数を使用せずにコマンドラインでこれを実行できます。
/Applications/GIMP.app/Contents/MacOS/GIMP -b "$(for name in 0 1 2 3; do echo \(script-fu-overlay \"png0004.tif\" \"png000$name.tif\"\) ; done)"
eval
ここでは、単一引用符をエスケープしないため、エスケープ処理をオフにする必要があります。必要な唯一のことは、コマンドが$(...)の周りの二重引用符を拡張して単語の分割が発生するのを防ぎ、結果を引数として渡すことですgimp
。