web-dev-qa-db-ja.com

最初のエラーで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ですが、ファイル全体が完了したときにのみ表示されます。最初の問題で、より早く停止する方法は?

32
yegor256

一般的な方法

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

説明

pages.txt内のすべてのURLに対して、sh -c 'curl ... $0 || exit 255'を1つずつ実行し(-n 1)、コマンドが失敗した場合は255で強制終了します。

man xargs から:

コマンドの呼び出しがステータス255で終了した場合、xargsはそれ以上の入力を読み取らずに直ちに停止します。これが発生すると、エラーメッセージがstderrに発行されます。

43
whoan

Xargsを使用して要求する方法を見つける方法は見つかりませんでしたが、readを使用したループが目的の可能性があります。

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
davrieb