我正在使用以下 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 完成下载而引起的。
我相信这一点,因为如果我一次将每一行复制粘贴到命令提示符中(并且亲自等待下载完成),Cat 会像我预期的那样创建一个合并的存档。如果我从脚本中复制上述所有六行,然后将所有内容粘贴到同一个命令提示符中,我会看到脚本遇到的相同问题。
那么有没有办法让 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
答案1
Bash 将&
URL 中的符号视为命令的终止符,并将其作为后台进程执行。如果您在 bash 中输入任何命令并在&
其后附加一个,它将在后台运行该命令并立即将控制权返回给调用脚本或终端。它们之间的字段将作为命令本身执行。
为了防止 bash 以这种方式解释 URL,请将整个内容括在引号中。这将使它将整个 URL 作为字符串参数传递,并且它将作为前台进程运行。