【问题标题】:Pass multiline argument with xargs使用 xargs 传递多行参数
【发布时间】:2019-01-30 20:08:41
【问题描述】:

我想通过 xargs 将文件内容作为引用的程序参数传递以跳过临时文件创建。

使用临时文件我可以这样做:

myprogram > /tmp/lld.json
zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "`cat /tmp/lld.json`"
rm /tmp/lld.json

但我不希望对/tmp/lld.json 进行这种额外操作。

所以我尝试像这样使用xargs

myprogram |
xargs -e -I'{}' zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "'{}'"

使用 xargs 手册页指导:

-我替换-str

-e[eof-str] ...如果省略eof-str,则没有文件结尾字符串..

http://man7.org/linux/man-pages/man1/xargs.1.html

xargz 对每一行执行zabbix-sender 多次。

我猜-I-e 选项是互斥的选项。但我也假设我误解了xargs 手册..

【问题讨论】:

  • 似乎xargs 不是您在这里需要的工具(至少从您的原始描述来看),实际上,通过直接传递myprogram 输出,除了shell 本身之外没有其他工具作为-o 参数,即:zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "$(myprogram)"(这里$(...) 构造相当于反引号)
  • 谢谢,@jjo!您的评论听起来令人沮丧,因为.. myprogram 是 bash-script 中的多行..
  • 我看到了将 bash 脚本代码转换为函数的解决方法,然后我可以像这样使用它:myfunct() { ...; }; zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "$(myfunct)",这不是我想要的。但它有效..
  • 似乎xargs -e 允许将多行执行为单行,这从这个简单的实验中可以看出:echo -en "1\n2" | xargs -e echo 34 输出:34 1 2。另一种解决方法 - 将 JSON 文档转换为单个字符串

标签: xargs


【解决方案1】:

这行得通吗?

zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "`myprogram`"

如果您坚持使用xargs 来做到这一点,那么请使用-0

myprogram | xargs -0 -I{} zabbix_sender -z 127.0.0.1 -s testhost -k llditem -o "'{}'"

【讨论】:

  • 是的,谢谢,这正是它现在的工作方式。但问题是关于xargs..
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 2019-10-05
  • 2017-08-16
  • 2021-10-06
  • 1970-01-01
  • 2020-10-03
  • 2016-03-06
相关资源
最近更新 更多