prevent xargs from quitting on error
Solution 1:
Similar to larsks
answer but more explicit:
xargs sh -c "somecommand || true"
Solution 2:
You could wrap the perl script with another simple bash script:
#!/bin/bash
real-command "$@" || exit 0
This will call real-command passing it all the parameters that you pass to this fake-command and it will always return a 0 exit code (that means it is always successful) and xargs will never stop with this.
Solution 3:
You could write your xargs invocation to mask the return codes of your command lines. With something like the following,xargs
will never see exit codes return by somecommand:
xargs sh -c "somecommand || :"
Solution 4:
Just found a fun answer to this one, though its usefulness will depend on the command you're trying to run.
If you're using xargs to basically assemble a list of commands, you can get this behavior by telling xargs to echo the command, then piping to bash.
For example, if you're trying to delete a list of things that may or may not exist:
# 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
This works because, first, xargs is only ever calling echo, so it won't see any errors. Then second, because bash's default behavior to continue execution after a failed statement.
To be more specific about my case, I was using this to remove a bunch of old application versions from AWS ElasticBeanstalk like so:
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
Solution 5:
Following construction works for me:
ls | xargs -I % svn upgrade %
Even if svn upgrade failed on some element, process was continued