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

时间:2016-09-22 20:57:17

标签: bash shell command-line command quotations

参数文件

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

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[@]}"