如果您不希望参数被静默分割
...也就是说:以下答案适用于不能将./myprogram --first-argument "first value" 静默更改为./myprogram --first-argument; ./myprogram "first value" 的情况。
如果你的参数是一对一的文字
也就是说,如果您的输入如下所示:
--first-argument
first value
--second-argument
second value
你的意思是这样运行:
./myprogram --first-argument "first value" --second-argument "second value"
...那么您应该使用(使用 bash 4.0 或更高版本):
readarray -t args <arguments.dat
./myprogram "${args[@]}"
...或(对于 bash 3.x 也是如此):
args=( )
while IFS= read -r arg; do
args+=( "$arg" )
done <arguments.dat
./myprogram "${args[@]}"
如果您的参数带有引号或转义以区分它们
也就是说,如果您的文件包含类似的内容(请注意,换行符和不带引号的空格在此处的行为相同):
--first-argument "first value"
--second-argument "second value"
...你的意思是这样运行:
./myprogram --first-argument "first value" --second-argument "second value"
...那么你应该使用:
args=( )
while IFS= read -r -d '' arg; do
args+=( "$arg" )
done < <(xargs printf '%s\0' <arguments.dat)
如果你控制你的参数格式
使用 NUL 分隔的值。也就是这样创建文件:
printf '%s\0' "argument one" "argument two" >arguments.dat
...并解析如下:
args=( )
while IFS= read -r -d '' arg; do
args+=( "$arg" )
done <arguments.dat
./myprogram "${args[@]}"
这适用于所有可能的参数值,即使是带有文字换行符、文字引号、文字反斜杠或其他不可打印字符的参数值。 (在 UNIX 命令行中,文字 NUL 不可能,因为命令行由以 NUL 结尾的字符串组成;因此,NUL 是唯一可以完全安全地用于明确分隔字符串中的参数的字符) .
如果需要跨调用拆分参数
如果期望的结果(当文件中的参数多于可以传递给程序调用的参数时)是程序的多个不同调用,每个调用都接收参数的子集,则此小节是相关的。在这一系列案例中,xargs 是适合这项工作的工具。
如果在 GNU 平台上,您可能希望运行 xargs -a arguments.dat 而不是重定向标准输入;但是,BSD xargs 不支持此功能(如在 MacOS 上),因此此处未演示。
如果你的参数是一对一的文字
使用 GNU xargs(大多数 Linux 平台):
xargs -d $'\n' ./myprogram <arguments.dat
使用 BSD xargs(MacOS、FreeBSD/OpenBSD/等):
xargs -0 ./myprogram < <(tr '\n' '\0' <arguments.dat)
如果您的参数带有引号或转义以区分它们
xargs ./myprogram <arguments.dat
如果您生成了以 NUL 分隔的输入
xargs -0 ./myprogram <arguments.dat