【问题标题】:How can I feed this long line of arguments to an executable?如何将这么长的参数行提供给可执行文件?
【发布时间】:2017-01-31 14:30:23
【问题描述】:

参数文件

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

第二次尝试导致可执行文件不返回任何内容。

问题

  • 我对@9​​87654329@ 做错了吗?
  • 修复第二次尝试后,是否会遇到与第一次尝试相同的问题 (Command Line Too long)?
  • 是否存在导致./myexec 将长字符串视为单个参数或类似参数的引用问题?
  • 您是否建议我尝试另一种方式将参数提供给myexec

仅供参考

我在Mac OS X 10.11.3Terminal 2.6.1

【问题讨论】:

  • 如果太长而无法放入ARG_MAX,当您使用xargs 时它仍然会太长——xargs 只会将其拆分为可执行文件的多个调用,每个调用他们只给出了你想要的参数的一个子集(因此,两者都不正确)。
  • @CharlesDuffy 哦……好的。有没有办法解决这个问题?
  • 审核您定义的环境变量集,并取消设置您可以不做的任何事情——它们使用用于命令行参数的相同空间池。还添加了一个答案。
  • ...否则,您需要查看您正在运行的命令是否允许配置文件或类似的选项/参数/&c 替代源。待指定。
  • 参数列表有多长? ARG_MAX 在 OS X 上是 262K。你在做什么需要比这更多的参数?

标签: bash shell command-line command quotations


【解决方案1】:

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

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

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


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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 2011-02-28
    • 1970-01-01
    • 2020-06-07
    相关资源
    最近更新 更多