より簡潔な方法でwget転送を表示します(エラー検出機能は維持しながら)。

より簡潔な方法でwget転送を表示します(エラー検出機能は維持しながら)。

wgetには進行状況バーを表示または表示しないいくつかのオプションがあることがわかります。

wget転送をより短い方法、つまりパーセンテージまたは動的な方法で表示したいが、すでに出力を持つスクリプトに挿入する必要があるため、既存のwget出力と同じくらいのスペースを占有しません。

私の目標は、ユーザーにファイルがダウンロードされていることを示し、スピードまで示していますが、スクリプトの全体的な外観を台無しにしないことです。

重要:私のwget段落はif then elseスクリプト内にあるので、エラー検出を維持する必要があります。

私のスクリプトには次のブロックがあります。

if wget -O filename http://someurl then
    some_action
else
    some_other_action
fi

誰かがこの種の改善を含むカスタム進捗データまたはバーの興味深い例を提供できますか?ありがとうございます;)

答え1

次のように「ドット」進行状況出力スタイルを使用する場合:

   500K .......... .......... .......... .......... ..........  2%  496K 91s

awkその後、stderrは同様のファイルにパイプし、最後の2列に表示されている「2%」フィールドのみを印刷できます。

wget ... --progress=dot -q --show-progress 2>&1 |
awk 'NF>2 && $(NF-2) ~ /%/{printf "\r %s",$(NF-2)} END{print "\r    "}'

行に変更されたパーセント値が表示され、最終的に消去されます。


wgetの戻りコードを保持するには、if..elseスクリプトで次のように設定して、パイプが失敗したコマンド(最も右のコマンドだけでなく)のエラーコードを返すようにbashに要求できます。

set -o pipefail

あるいは、コメントで提案されているように、すべてのコードif..else..fiをブロック内で変更せずに、最後のstderrをより有益なawkにパイプすることもできます。

( if wget ...
  fi
  if wget ...
  fi
  if wget ...
  fi
) 2>&1 | awk '
/^Saving to:/ { fn = gensub(/^Saving to: /,"",1) }
NF>2 && $(NF-2) ~ /%/ { printf "\r%s %s",fn,$(NF-2) }
END { gsub(/./," ",fn); print "\r    " fn }'

あるいは、stderrで重要なエラーメッセージを失わないようにするには、すべてのwgetコマンドのstderrを3番目のファイル記述子にリダイレクトします。

( if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
) 3>&1 | awk ...

関連情報