看起来规范的方式bash
是这样的
unset args
while IFS= read -r line; do
args+=("$line")
done < file
cmd "${args[@]}"
或者,如果您的bash版本具有mapfile
:
mapfile -t args < filename
cmd "${args[@]}"
我可以在mapfile和while读取循环与单线之间找到的唯一区别
(set -f; IFS=$'\n'; cmd $(<file))
是前者会将空白行转换为空参数,而单行代码将忽略空白行。在这种情况下,无论如何我还是更喜欢单线行为,因此紧凑的双倍奖励。
我会使用,IFS=$'\n' cmd $(<file)
但是它不起作用,因为$(<file)
在IFS=$'\n'
生效之前会被解释为形成命令行。
尽管在我的情况下不起作用,但我现在了解到,有很多工具都支持终止行,null (\000)
而newline (\n)
在处理文件名(例如文件名)时,终止符确实使终止行变得更容易:
find / -name '*.config' -print0 | xargs -0 md5
将完全限定的文件名列表作为md5的参数提供,而不会出现任何乱码或插值等情况。这导致了非内置解决方案
tr "\n" "\000" <file | xargs -0 cmd
尽管这也忽略了空行,但是它确实捕获了只有空格的行。