我在名为 的文本文件中安装了 URL 列表myurls
:
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
:如何提供存储在文件中的(换行符分隔的)字符串列表作为命令的参数列表?
答案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"
在可能更改普遍应用的属性后恢复所有 shell 状态时要格外小心。但基本原则只是将外壳的分离器设置在 中$IFS
,以小心不是如果任何命令替换的扩展包含[?*
,则将其扩展为 glob ,然后将其不加引号地扩展为参数列表。
它可以在子 shell 中更简单、更稳健地完成,因为您不必承受任何后遗症:
( 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 均以空格分隔:
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