Как остановить xargs при первой ошибке?
У меня есть файл pages.txt
со 100 URL внутри. Я хочу проверить их один за другим и не выполнить первую проблему. Это то, что я делаю:
cat pages.txt | xargs -n 1 curl --silent \
--output /dev/null --write-out '%{url_effective}: %{http_code}\n'; echo $?
Код выхода 1
, но я вижу его только после завершения всего файла. Как остановиться раньше, по первой проблеме?
Ответы
Ответ 1
Общий метод
xargs -n 1 sh -c '<your_command> $0 || exit 255' < input
Конкретный случай
xargs -n 1 sh -c 'curl --silent --output /dev/null \
--write-out "%{url_effective}: %{http_code}\n" $0 || exit 255' < pages.txt
Описание
Для каждого URL-адреса в pages.txt
выполняется sh -c 'curl ... $0 || exit 255'
один за другим (-n 1
), принудительно завершая работу с 255
, если команда завершается с ошибкой.
Из man xargs
:
Если какой-либо вызов команды завершается со статусом 255, xargs немедленно остановится, не считывая никаких дополнительных данных. Сообщение об ошибке выдается на stderr, когда это происходит.
Ответ 2
Я не нашел способ делать то, что вы просите с помощью xargs, но цикл с чтением может быть тем, что вы ищете.
while read URL; do
curl --silent \
--output /dev/null --write-out '%{url_effective}: %{http_code}\n' $URL;
RET=$?;
echo $RET;
if [ $RET -ne 0 ]; then break; fi
done < pages.txt