提供存储在文件中的字符串作为命令的参数列表?

提供存储在文件中的字符串作为命令的参数列表?

我在名为 的文本文件中安装了 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

相关内容