Как остановить 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