次の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
Bashは、URL内の&
記号をコマンドのターミネーターと見なし、バックグラウンドプロセスとして実行しています。 bashにコマンドを入力し、それに&
を追加すると、コマンドがバックグラウンドで実行され、呼び出し元のスクリプトまたは端末にすぐに制御が戻ります。それらの間のフィールドは、コマンド自体として実行されています。
BashがURLをこのように解釈しないようにするには、全体を引用符で囲みます。これにより、URL全体が文字列パラメーターとして渡され、フォアグラウンドプロセスとして実行されます。