如何将这一长串参数提供给可执行文件?

How can I feed this long line of arguments to an executable?

参数文件

args.txt 上,存在针对可执行文件的不同调用的一长串参数。每行包含可执行文件的单个调用的参数。一行 args.txt 看起来像

2 1 -A 7 -B true -C 0.0035 -D /path/to/somewhere ....

2 1 开头的行作为要提供给可执行文件的前两个参数是 "unnamed"(不带有标志)。

先试试

我第一次尝试

i=5
./myexec `sed "${i}q;d" args.txt`

大部分时间都有效。但是,对于某些行,参数太长,我收到 Error: Command Line Too long 因为我超过了 getconf ARG_MAX。请注意,该软件不允许通过命令行以外的方式指定参数。

第二次尝试

所以我尝试了

sed "${i}q;d" args.txt | xargs ./myexec

第二次尝试导致可执行文件return什么都没有。

问题

仅供参考

我在 Mac OS X 10.11.3Terminal 2.6.1

ARG_MAX 是操作系统对命令行参数和环境变量的组合大小的约束。

因为它是操作系统强制执行的约束,如果不进行操作系统级别的更改就无法绕过它xargs 会将您的代码拆分为多个调用,但每个调用仅提供所需参数的一个子集。

如果您不能减少参数列表的长度(并且您正在 运行ning 的程序无法通过命令行以外的任何方式读取配置,那么您可以做什么) , 取消设置您不需要的任何环境变量。


如果您宁愿在命令行参数列表太长而无法正确执行时直接失败,而不是(如 xargs 那样)运行 两次或多次调用,每次调用都有一个子集在给出的参数中,我建议对每一行使用以下代码:

args=( )
while IFS= read -r -d '' arg; do
  args+=( "$arg")
done < <(xargs printf '%s[=10=]' <<<"$line")

./yourprog "${args[@]}"