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?
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.
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