次のテキストファイルにURLリストをインストールしましたmyurls
。
http://www.examples.com/1
http://www.examples.com/2
http://www.examples.com/3
wkhtmltopdf
これらのURLを入力に渡すにはどうすればよいですか?
ファイルを使わずにURLを保存する簡単な方法は次のとおりです。
wkhtmltopdf http://www.examples.com/1 http://www.examples.com/2 http://www.examples.com/3 all.pdf
おそらく、wkhtmltopdf
買収に関する特別な要件があるかもしれませんが、私の質問は次のようになります wkhtmltopdf
。ファイルに保存されている(改行で区切られた)文字列のリストをコマンドの引数リストとして提供する方法は?
答え1
努力する:
# 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
中に入れておくだけです。いいえコマンド置換の拡張にが含まれている場合は[?*
globに展開し、引用符なしで引数リストに展開します。
副作用を受ける必要がないため、サブシェルでより簡単で強力に実行できます。
( set -f; IFS='
'; wkhtmltopdf $(cat) allurl.pdf
) <myurls
答え2
残念ながら、これは本当ではありませんが、wkhtmltopdf
多くのコマンドはファイルからパラメータを読み取るオプションを提供します(wget -i
たとえば、これは可能な限り好む方法です)。
ファイルの空白が重要でない場合は、コマンド置換が機能します。
wkhtmltopdf $(cat myurls) all.pdf
を使用すると、このxargs
例でも機能しますが、通常実行したい操作がある場合は、最後の実行のページだけが一度だけ実行されることを確認wkhtmltopdf
する必要があります。all.pdf
wkhtmltopdf
xargs -a myurls sh -c 'wkhtmltopdf "$@" all.pdf'
wkhtmltopdf
標準入力からパラメータを読み取るオプションをサポートします。、--read-args-from-stdin
。これを使用して改行区切りのURLを指定した場合は繰り返します。これを防ぐには、標準入力がすべてのURLがスペースで区切られた1行であることを確認する必要があります。
tr "\n" " " < myurls | wkhtmltopdf --read-args-from-stdin all.pdf
答え3
そしてxargs
:
xargs -a myurls sh -c 'wkhtmltopdf $@ all.pdf'
答え4
別の方法:
wkhtmltopdf $(printf '%s ' $(<myurls)) all.pdf