执行wget后脚本偶尔无法运行,是否需等待wget执行完成?
问题解答:是否需要等待wget执行完成?
不需要额外添加等待逻辑——你用的$(wget -qO- $URL)是bash的命令替换语法,shell会自动等待wget完全执行结束,捕获它的全部标准输出后,才会把结果赋值给LINK变量。脚本偶尔运行失败,根源不是没等wget执行,而是其他细节没处理到位:
脚本里可能导致失败的几个坑
- wget失败未被拦截:脚本开启了
set -e,但命令替换($())里的命令默认不会触发set -e的退出逻辑。如果wget因网络问题、页面无法访问返回非0状态,脚本不会直接退出,反而会把空值赋值给LINK,后续curl用空URL必然失败。 - HTML结构变化导致匹配失效:grep的正则是硬写的页面链接格式,一旦Tor官网下载页面的HTML结构变动,grep就抓不到正确的
.tar.xz链接,LINK为空后后续步骤全部崩溃。 - curl+tar管道容错性差:如果curl下载中途中断,tar会接收到不完整的压缩包,解压直接失败,且不会提前报错。
优化建议
- 给wget加错误检查:手动判断执行状态,避免空值流入后续步骤:
PAGE_CONTENT=$(wget -qO- "$URL") || { echo "wget获取页面失败"; exit 1; } LINK=$(echo "$PAGE_CONTENT" | grep -oP -m 1 'href="\K/dist.+?ALL.tar.xz') || { echo "未找到下载链接"; exit 1; } - 改用更可靠的链接方式:直接使用Tor项目官方的固定版本下载链接,避免依赖页面HTML解析。
- 增强curl和tar的可靠性:给curl加
-C -支持断点续传,下载完成后先校验文件哈希,再执行解压操作,避免处理损坏的压缩包。
内容的提问来源于stack exchange,提问作者Timur
相关产品推荐
相关产品推荐

