myurls
という名前のテキストファイルにURLのリストをインストールします。
http://www.examples.com/1
http://www.examples.com/2
http://www.examples.com/3
これらのURLを入力としてwkhtmltopdf
に渡すにはどうすればよいですか?
URLを保存するためにファイルを使用しない直接的な方法は
wkhtmltopdf http://www.examples.com/1 http://www.examples.com/2 http://www.examples.com/3 all.pdf
wkhtmltopdf
の引数には特別な要件があるかもしれませんが、私の質問はwkhtmltopdf
よりも一般的かもしれません:ファイルに格納されている(改行で区切られた)文字列のリストをリストとして提供する方法コマンドへの引数の?
試してください:
# disable Shell filename generation (globbing)
# and temporarily save applicable Shell state
set -f -- "-${-:--}" "${IFS+IFS=\$2;}" "$IFS" "$@"
# explicitly set the Shell's Internal
# Field Separator to only a newline
eval "IFS='$(printf \\n\')"
# split command substitution into an
# arg array at $IFS boundaries while
# eliding all blank lines in myurls
wkhtmltopdf $(cat <myurls) allurl.pdf
# restore current Shell to precmd state
unset IFS; set +f "$@"; eval "$1 shift 2"
これは、普遍的に適用される属性を変更した後、すべてのシェル状態を復元する場合は特に注意が必要です。ただし、基本的な原則は、シェルのスプリッターを$IFS
に設定し、コマンド置換の展開に[?*
が含まれている場合にグロブにnotを設定してから、展開することです。引数のリストに引用符で囲まれていません。
後遺症を抱える必要がないため、サブシェルではるかに簡単に堅牢に実行できます。
( set -f; IFS='
'; wkhtmltopdf $(cat) allurl.pdf
) <myurls
残念ながら、wkhtmltopdf
の場合はそうではありませんが、多くのコマンドには、ファイルから引数を読み取るオプションがあります(wget -i
例えば);可能な場合は、これが推奨されるアプローチです。
ファイル内の空白が重要でない場合、コマンド置換は機能します。
wkhtmltopdf $(cat myurls) all.pdf
xargs
を使用することもあなたの例で機能しますが、一般的にあなたがやろうとしていることを考えると、それがwkhtmltopdf
を1回だけ実行することを確認する必要があります。 all.pdf
には、wkhtmltopdf
の最後の実行からのページのみが含まれます。
xargs -a myurls sh -c 'wkhtmltopdf "$@" all.pdf'
wkhtmltopdf
標準入力から引数を読み取るオプションをサポートします 、--read-args-from-stdin
、しかしそれは実行を繰り返し、標準入力の各行を残りのコマンドライン引数とマージします。そう
wkhtmltopdf --read-args-from-stdin all.pdf < myurls
と同等になります
wkhtmltopdf http://www.examples.com/1 all.pdf
wkhtmltopdf http://www.examples.com/2 all.pdf
wkhtmltopdf http://www.examples.com/3 all.pdf
これはあなたが望むものではありません(all.pdf
最後のサイトのみが含まれます)。
xargs
の場合:
xargs -a myurls sh -c 'wkhtmltopdf $@ all.pdf'
別のアプローチ:
wkhtmltopdf $(printf '%s ' $(<myurls)) all.pdf