参数文件
在args.txt
上,对可执行文件的不同调用有很长的一系列参数。每行包含可执行文件的单个调用的参数。一行args.txt
看起来像
2 1 -A 7 -B true -C 0.0035 -D /path/to/somewhere ....
以2 1
开头的行作为可执行文件的前两个参数是"未命名" (不带旗帜)。
首先尝试
我第一次尝试
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
第二次尝试导致可执行文件没有返回任何内容。
问题
sed "${i}q;d" args.txt | xargs ./myexec
做错了吗?Command Line Too long
)?./myexec
将长字符串视为单个参数或类似内容?myexec
?FYI
我正在使用Mac OS X 10.11.3
Terminal 2.6.1
答案 0 :(得分:2)
ARG_MAX
是对命令行参数和环境变量的组合大小的操作系统约束。
由于这是一个操作系统强制约束,如果没有操作系统级别的更改,则无法绕过它。 xargs
会将您的代码拆分为多个调用,但每个调用只会给出所需参数的一部分。
如果你不能减少参数列表的长度(并且你运行的程序无法通过命令行以外的任何方式读取配置),那么你可以做什么,取消设置任何环境变量你不需要。
如果您的命令行参数列表太长而无法正确执行,而不是(正如xargs
那样)运行两个或多个调用,每个调用都有一个给定的参数子集,那么建议每行使用以下代码:
args=( )
while IFS= read -r -d '' arg; do
args+=( "$arg")
done < <(xargs printf '%s\0' <<<"$line")
./yourprog "${args[@]}"