如何将这一长串参数提供给可执行文件?
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什么都没有。
问题
- 我在
sed "${i}q;d" args.txt | xargs ./myexec
上做错了吗?
- 一旦我修复了第二次尝试,我是否会遇到与第一次尝试相同的问题 (
Command Line Too long
)?
- 是否存在导致
./myexec
将长字符串视为单个参数或类似内容的引用问题?
- 您是否建议我尝试另一种方式向
myexec
提供参数?
仅供参考
我在 Mac OS X 10.11.3
和 Terminal 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[@]}"
参数文件
在 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什么都没有。
问题
- 我在
sed "${i}q;d" args.txt | xargs ./myexec
上做错了吗? - 一旦我修复了第二次尝试,我是否会遇到与第一次尝试相同的问题 (
Command Line Too long
)? - 是否存在导致
./myexec
将长字符串视为单个参数或类似内容的引用问题? - 您是否建议我尝试另一种方式向
myexec
提供参数?
仅供参考
我在 Mac OS X 10.11.3
和 Terminal 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[@]}"