You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

终端执行命令正常,脚本运行后tracks文件为空,求排查原因

脚本执行后tracks文件为空的问题排查

1. while循环重定向错误(核心原因)

你的脚本中,while read a b; do ... done > $dj_name-tracks 这一行是将循环输出写入到目标文件,会直接覆盖之前grep生成的$dj_name-tracks内容,同时循环没有指定输入源,read无法读取到任何链接,最终导致文件被清空。

正确写法应该是用<读取已生成的tracks文件:

while read a b; do 
    wget --user-agent=Mozilla/5.0 --save-cookies cookies.txt --post-data 'dir="$dir1"=&file="$file1"' --no-check-certificate "$a" "$b"
done < $dj_name-tracks

2. 首次wget未指定User-Agent,页面返回内容不一致

脚本中第一次执行wget时没有设置--user-agent参数,hearthis.at可能会对Wget默认的User-Agent返回不含mp3链接的简化页面。而你在终端执行时,可能使用了浏览器的UA或已有相关配置,导致页面内容不同。

需要给首次wget也添加UA:

wget --user-agent=Mozilla/5.0 https://hearthis.at/$dj_name/podcast/ -O $dj_name

3. 正则表达式匹配不严谨

你使用的grep正则"(https)://[a-zA-Z0-9./?=_%:-]*.mp3*"存在两个问题:

  • .mp3*表示匹配.mp后接0个或多个3,无法精准匹配.mp3结尾的链接
  • 字符集中的-未转义或放在末尾,可能被解析为字符范围(虽然当前场景可能不报错,但不够严谨)

修改后的正则:

grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3" | sort -u > $dj_name-tracks

如果要强制匹配链接结尾,可改为:

grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3$" | sort -u > $dj_name-tracks

4. 变量未加引号,存在特殊字符风险

若输入的dj_name包含空格、&等特殊字符,脚本会直接报错。需给所有变量添加双引号:

mkdir "$dj_name"
cd "$dj_name"
wget --user-agent=Mozilla/5.0 "https://hearthis.at/$dj_name/podcast/" -O "$dj_name"
cat "$dj_name" | grep -Eo "https://[a-zA-Z0-9./?=_%:-]*\.mp3" | sort -u > "$dj_name-tracks"
while read a b; do 
    wget --user-agent=Mozilla/5.0 --save-cookies cookies.txt --post-data 'dir="$dir1"=&file="$file1"' --no-check-certificate "$a" "$b"
done < "$dj_name-tracks"

内容的提问来源于stack exchange,提问作者Roberto Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 13:05:34