防止xargs因错误而退出

根据手册页,xargs将退出,如果其中一个执行行退出的错误为255:

如果任何命令的调用退出状态为255,xargs将立即停止,不会读取任何进一步的input。 发生这种情况时,stderr上会发出错误消息。

我怎样才能让xargs 这样做呢?

我有一个1500行左右的批处理作业,我想运行,一次50行。 我发现它总是死在某一行,而不是完成这项工作。 不好!

一个更好的问题,描述我所要做的问题是:

我怎样才能运行一个1500行的批处理脚本,每次50行,这样它就不会中途退出这个工作,这样输出就被捕获到某种types的日志文件中了?

你可以用另一个简单的bash脚本来包装perl脚本:

#!/bin/bash real-command "$@" || exit 0 

这将调用真实命令将所有传递给这个伪命令的parameter passing给它,并且它总是返回0退出代码(这意味着它总是成功的),并且xargs永远不会停止。

类似于larsks回答,但更明确:

 xargs sh -c "somecommand || true" 

你可以编写你的xargs调用来屏蔽命令行的返回码。 像下面这样的东西, xargs永远不会看到某些命令返回的退出代码:

 xargs sh -c "somecommand || :" 

以下为我的施工作品:

 ls | xargs -I % svn upgrade % 

即使某些元素的svn升级失败,过程仍然继续

刚刚find了一个有趣的答案,尽pipe它的用处取决于你试图运行的命令。

如果你使用xargs来组装一个命令列表,你可以通过告诉xargs回显命令然后pipe道到bash来获得这个行为。

例如,如果您试图删除可能存在或可能不存在的事物列表:

 # presume this will fail in a similar way to your command cat things_to_delete | xargs -n1 delete_command_that_might_exit # instead echo the commands and pipe to bash cat things_to_delete | xargs -n1 echo delete_command_that_might_exit | bash 

这是有效的,因为,首先,xargs只是调用回声,所以它不会看到任何错误。 那么第二,因为bash的默认行为在失败语句之后继续执行。

为了更具体地说明我的情况,我使用它从AWS ElasticBeanstalk中移除了一堆旧的应用程序版本,如下所示:

 aws elasticbeanstalk describe-application-versions --application-name myapp |\ jq -r '.ApplicationVersions | sort_by(.DateCreated) | .[0:-10] | .[].VersionLabel' |\ xargs -n1 \ echo aws elasticbeanstalk delete-application-version \ --delete-source-bundle --application-name myapp --version-label |\ bash 

如果您使用xargsfind xargs ,请使用find-exec选项:

 find . -name '*.log' -exec somecommand {} \;