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