web-dev-qa-db-ja.com

wgetがダウンロードを完了するのを待っていないBashスクリプト

次のbashスクリプトを使用して、さまざまなgzipアーカイブをマージしています。

wget -O bluelvl1.gz http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz
wget -O bluelvl2.gz http://list.iblocklist.com/?list=gyisgnzbhppbvsphucsw&fileformat=p2p&archiveformat=gz
wget -O badpeer.gz http://list.iblocklist.com/?list=cwworuawihqvocglcoss&fileformat=p2p&archiveformat=gz
wget -O Microsoft.gz http://list.iblocklist.com/?list=xshktygkujudfnjfioro&fileformat=p2p&archiveformat=gz
wget -O unallocated.gz http://list.iblocklist.com/?list=gihxqmhyunbxhbmgqrla&fileformat=p2p&archiveformat=gz
cat bluelvl1.gz bluelvl2.gz badpeer.gz Microsoft.gz unallocated.gz > blocklist.p2p.gz

私が抱えている問題は、「cat」コマンドが何も含まれていない「blocklist.p2p.gz」を作成していることです。この問題は、bashがwgetのダウンロードの完了を待たないことが原因であると考えています。

これは、各行をコマンドプロンプトに一度に1つずつコピーして貼り付けると(そしてダウンロードが完了するのを個人的に待つと)、Catが期待どおりにマージされたアーカイブを作成するためだと思います。上記の6行すべてをスクリプトからコピーしてから、ロット全体を同じコマンドプロンプトに貼り付けると、スクリプトで発生しているのと同じ問題が発生します。

では、bashにwgetが終了するのを待たせる方法はありますか? Bashはデフォルトで待機することになっていますが、何かが原因でこれが発生していませんか?解決策をいただければ幸いです。

編集:以下のコメントによると、使用する正しいスクリプトは次のとおりです。

wget -O bluelvl1.gz "http://list.iblocklist.com/?list=ydxerpxkpcfqjaybcssw&fileformat=p2p&archiveformat=gz"
wget -O bluelvl2.gz "http://list.iblocklist.com/?list=gyisgnzbhppbvsphucsw&fileformat=p2p&archiveformat=gz"
wget -O badpeer.gz "http://list.iblocklist.com/?list=cwworuawihqvocglcoss&fileformat=p2p&archiveformat=gz"
wget -O Microsoft.gz "http://list.iblocklist.com/?list=xshktygkujudfnjfioro&fileformat=p2p&archiveformat=gz"
wget -O unallocated.gz "http://list.iblocklist.com/?list=gihxqmhyunbxhbmgqrla&fileformat=p2p&archiveformat=gz"
cat bluelvl1.gz bluelvl2.gz badpeer.gz Microsoft.gz unallocated.gz > blocklist.p2p.gz
5
XJDHDR

Bashは、URL内の&記号をコマンドのターミネーターと見なし、バックグラウンドプロセスとして実行しています。 bashにコマンドを入力し、それに&を追加すると、コマンドがバックグラウンドで実行され、呼び出し元のスクリプトまたは端末にすぐに制御が戻ります。それらの間のフィールドは、コマンド自体として実行されています。

BashがURLをこのように解釈しないようにするには、全体を引用符で囲みます。これにより、URL全体が文字列パラメーターとして渡され、フォアグラウンドプロセスとして実行されます。

5
Ben Richards