首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管道输出到可执行文件,多次调用可执行文件。

问管道输出到可执行文件,多次调用可执行文件。
EN

Stack Overflow用户
提问于 2021-07-20 08:27:35
回答 2查看 80关注 0票数 1

我正在将命令的输出作为可执行文件的参数:

代码语言:javascript
复制
command |  xargs -d '\n' "executable"

当命令产生足够多的输出行时,我可以看到可执行文件多次运行,每次运行数据的子页面。这是有问题的,因为可执行文件中的状态假设每个调用都独立于下一个调用。是否可以强制“命令”将整个输出输入到可执行文件中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-20 08:31:20

不要使用xargs,使用$(...)将输出替换到命令行中。

代码语言:javascript
复制
IFS=$'\n' # this is analogous to -d '\n' in xargs
set -o noglob # prevent wildcard expansion when substituting command output
executable $(command)

但是,如果command的输出太长,这可能会导致错误。xargs将其拆分为多个调用,以防止出现这种情况。但是,如果确实需要在一次调用中调用所有内容,则错误可以判断这是不可能的,并防止由于多次调用而导致的不正确结果。

票数 2
EN

Stack Overflow用户

发布于 2021-07-20 08:42:41

是否可以强制“命令”将整个输出输入到可执行文件中?

是也不是。

若要只运行可执行文件一次,可以使用

代码语言:javascript
复制
command | bash -c 'mapfile -t a; executable "${a[@]}"'

但是,如果超过系统的ARG_MAX,则可能会失败。程序调用及其参数和环境变量必须小于ARG_MAX字节。(在Linux上,甚至还有一个限制每个参数的大小的附加限制)。这是无可奈何的。

您可以使用ARG_MAX或getconf ARG_MAX检查您的xargs --show-limits < /dev/null。本网站在不同的系统上编译了一个很好的值列表。

如果您刚刚超过最大值,并且不需要环境变量,您可以清除环境以腾出一些空间。

代码语言:javascript
复制
command | env -i bash -c 'mapfile -t a; executable "${a[@]}"'

除此之外,别无选择,只能多次运行executable或修改它,最好是让它从stdin中读取行而不是参数。这样你就可以写了

代码语言:javascript
复制
command | executable
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68451772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档