Согласно man-странице, xargs завершит работу, если одна из строк выполнения завершится с ошибкой 255:
Если какой-либо вызов команды завершается со статусом 255, xargs немедленно останавливается, не читая никаких дальнейших вводных данных. Когда это происходит, на stderr выдается сообщение об ошибке.
Как я могу заставить xargs не делать этого?
У меня есть около 1500 строк, которые я хочу запустить, по 50 строк за раз. Я обнаружил, что он всегда умирал на определенной линии, а не завершал работу. Не хорошо!
Еще лучший вопрос, описывающий то, что я пытаюсь сделать, это:
Как запустить пакетный сценарий на 1500 строк по 50 строк за раз, чтобы он не завершал работу посередине и чтобы выходные данные записывались в какой-либо файл журнала?
sh -c
для меня ворс!Вы можете написать свой вызов xargs, чтобы замаскировать коды возврата ваших командных строк. С чем-то вроде следующего,
xargs
никогда не увидит коды выхода, возвращаемые по некоторой команде :источник
Просто нашел забавный ответ на этот вопрос, хотя его полезность будет зависеть от команды, которую вы пытаетесь выполнить.
Если вы используете xargs для компоновки списка команд, вы можете получить такое поведение, сказав xargs повторить команду, а затем отправив команду bash.
Например, если вы пытаетесь удалить список вещей, которые могут или не могут существовать:
Это работает, потому что, во-первых, xargs всегда вызывает echo, поэтому он не видит никаких ошибок. Во-вторых, поведение bash по умолчанию для продолжения выполнения после неудачного оператора.
Чтобы быть более конкретным в моем случае, я использовал это для удаления нескольких старых версий приложений из AWS ElasticBeanstalk, например, так:
источник
Следующие строительные работы для меня:
Даже если обновление svn не удалось на каком-либо элементе, процесс был продолжен
источник
Если вы использовали
xargs
сfind
, используйте-exec
параметрfind
вместо:источник
xargs
мог запускать команды параллельно. Круто. Если вы хотите только минимизировать количество вызовов команд,-exec
есть+
параметр.