web-dev-qa-db-ja.com

コマンドの引数のリストとしてファイルに保存されている文字列を提供しますか?

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よりも一般的かもしれません:ファイルに格納されている(改行で区切られた)文字列のリストをリストとして提供する方法コマンドへの引数の?

3
Tim

試してください:

# 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
4
cuonglm

残念ながら、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最後のサイトのみが含まれます)。

2
Stephen Kitt

xargsの場合:

xargs -a myurls sh -c 'wkhtmltopdf $@ all.pdf'
1
FloHimself

別のアプローチ:

wkhtmltopdf $(printf '%s ' $(<myurls)) all.pdf
0
jimmij