Comment arrêter xargs sur la première erreur?

J'ai un fichier pages.txt avec 100 URL à l'intérieur. Je veux les vérifier un par un et échouer sur le premier problème. C'est ce que je fais:

cat pages.txt | xargs -n 1 curl --silent 
  --output /dev/null --write-out '%{url_effective}: %{http_code}n'; echo $?

Le code de sortie est 1, mais je ne le vois que lorsque le fichier entier est terminé. Comment arrêter plus tôt, sur le premier problème?

21
demandé sur yegor256 2014-10-21 14:26:27

2 réponses

Méthode Générale

xargs -n 1 sh -c '<your_command> $0 || exit 255' < input

Cas spécifique

xargs -n 1 sh -c 'curl --silent --output /dev/null \
    --write-out "%{url_effective}: %{http_code}\n" $0 || exit 255' < pages.txt

Explication

Pour chaque URL dans pages.txt, exécute sh -c 'curl ... $0 || exit 255', un par un (-n 1) obligeant à sortir avec 255 si la commande échoue.

De man xargs:

Si une invocation de la commande se termine avec un statut de 255, xargs s'arrêtera immédiatement sans lire d'autres entrées. Un message d'erreur est émis sur stderr lorsque cela se produit.

31
répondu whoan 2017-03-05 01:08:06

Je n'ai pas trouvé un moyen de faire ce que vous demandez avec xargs, mais d'une boucle pour lire peut-être ce que vous cherchez.

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
1
répondu davrieb 2014-10-21 11:07:15