【问题标题】:xargs ignoring part of command after &&xargs 在 && 之后忽略命令的一部分
【发布时间】:2022-12-09 11:02:00
【问题描述】:

我打算获取一个逗号分隔的文件列表,然后将其作为参数传递给使用 xargs 的命令。

然而,xargs 似乎忽略了 && 之后的命令部分。

$ find */build* -printf '%h/%f,'
jenkins/build.jenkinsfile,jenkins/build-x.groovy,


$ find */build* -printf '%h/%f,' | xargs -t python3 -m coverage combine python-bridge && python3 -m coverage xml --omit
python3 -m coverage combine python-bridge jenkins/build.jenkinsfile,jenkins/build-x.groovy,
Couldn't combine from non-existent path 'jenkins/build.jenkinsfile,jenkins/build-x.groovy,'

因此,该命令被解释为:

python3 -m coverage combine python-bridge jenkins/build.jenkinsfile,jenkins/build-x.groovy,

预期的:

python3 -m coverage combine python-bridge && python3 -m coverage xml --omit jenkins/build.jenkinsfile,jenkins/build-x.groovy,

任何指针都会有很大的帮助。

【问题讨论】:

  • 不是xargs将该输入分成两个命令:一个`find ... |汽车 ..
  • @dave_thompson_085 啊,我明白了。谢谢。你能建议我可以探索哪些命令来实现我想要达到的目标吗?我不太精通 shell 实用程序。

标签: linux ubuntu xargs


【解决方案1】:

Meta:我写了一个更长的评论,Stack 似乎以某种方式丢弃了它,所以我正在重新做作为获取编辑历史的答案,尽管我不确定这是否真的是编程(因此可能需要删除)。

这不是 xargs。shell 将该输入分解为两个命令,然后通过将 find */build* -printf '%h/%f,' 作为一个进程运行并将 stdout 连接到一个管道,将 xargs -t python3 -m coverage combine python-bridge 作为另一个进程运行并将 stdin 连接到同一管道来执行第一个管道;只有在这两个都完成之后,并且只有当 xargs 成功时(反过来只有当 python3 -m ... 成功时它才没有),shell 将运行第二个命令 python3 -m coverage xml --omit 作为第三个进程。

您可以通过引用将 && 传递给 xargs'&&' "&&" && 中的任何一个。但是 xargs 不是 shell,不会将 && 解释为“与”运算符;它会运行python3 带有参数 -m coverage combine python-bridge && python3 -m coverage xml --omit 并附加(一个)输入“文件名” jenkins/build.jenkinsfile,jenkins/build-x.groovy, 的进程,这也不起作用。

能够xargs 运行一个 shell,它又运行你想要的命令:

find */build* -printf '%h/%f,' | 
xargs -t sh -c 'python3 -m coverage combine python-bridge && python3 -m coverage xml --omit $*' dummy0'
# in general you should use "$@" to prevent split+glob from mangling 'special' arguments
# but here they have already survived xargs default parsing so shouldn't be special

但更简单的是更适当地安排你的命令:

python3 -m coverage combine python-bridge && 
find */build* -printf '%h/%f,' | python3 -m coverage xml --omit

或者因为这只有在文件列表适合一个命令时才能正常工作,所以你实际上不需要xargs主要功能,只是

python3 -m coverage combine python-bridge && 
python3 -m coverage xml --omit $(find */build* -printf '%h/%f,')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-07
    • 2011-11-20
    • 2022-11-01
    • 1970-01-01
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多