prevent xargs from quitting on error
larsks answer but more explicit:
xargs sh -c "somecommand || true"
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.
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 || :"
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
Following construction works for me:
ls | xargs -I % svn upgrade %
Even if svn upgrade failed on some element, process was continued