当自己写了一个脚本之后

作为代码经验仅限于 Hello world! 的业余选手,我对计算机技术却总是有着超过自身能力的兴趣。昨天又在折腾 VPS 上的代理程序,需要定时下载特定的文件以供使用。长期以来我的 Linux 技术保持在熟练使用一键脚本的水平,这一程序的搭建过程也不例外,但这次我第一次需要用到脚本未提供的功能,唯一的提示是讨论区别人的一句“自己写个 cron 就好了”。What do you do? Go.

虽然啥也不懂,但也不是毫无头绪。Cron 是没用过但听说过的 Linux 上可定时执行指定命令的程序,于是我的第一反应是搜索“cron 下载文件”。但显然,cron 并不能自觉地帮你下载文件,而只能执行你写好的下载文件的命令,不过这种南辕北辙的搜索倒真的绕地球一圈,找到了我需要的东西。作者是为了下载 NASA 每日一图(是我本科时候干过的事!)而写的脚本,我摘抄出自己需要的部分,再加上临时搜到的拷贝命令,就得到了:

1
2
3
4
5
6
7
#!/usr/bin/bash

wget -P /tmp "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat"
wget -P /tmp "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat"

cp /tmp/geoip.dat /usr/local/share/xray/
cp /tmp/geosite.dat /usr/local/share/xray/

看起来很不错。不过别急,先手动测试一下。复制第一行下载命令 wget -P /tmp "https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat" 到 SSH 执行,成功;再复制拷贝命令 cp /tmp/geoip.dat /usr/local/share/xray/,同样成功,完美。于是兴冲冲把脚本保存到 VPS,一执行:

1
2
3
4
5
6
7
8
9
10
root@vps:-# bash updategeo.sh
--2022-09-15 14:03:22-- https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geoip.dat%0D
Resolving github.com (github.com)... 192.30.255.112
Connecting to github.com (github.com) | 192.30.255.112| :443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/202209142214/geoip.dat%0D [following]
--2022-09-15 14:03:22-- https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/202209142214/geoip.dat%0D
Reusing existing connection to github.com: 443.
HTTP request sent, awaiting response... 404 Not Found
2022-09-15 14:03:22 ERROR 404: Not Found.

先 Found 再 Not Found,着实让我迷惑。昨晚大概就在这里卡了半小时,尝试了各种修改 wget 参数的方法都没有效果,最后把问题发给我那同样一知半解的计算语言学朋友就睡觉了。今天早晨被没关的窗户外核酸排队声音吵醒,虽然没睡够但也睡不着了,于是起来看看朋友回了我什么。他给我发的 stackoverflow 的一个提问也是关于 wget 无法下载,但和我的问题并不一样,不过这也提醒了我可以在这里搜一搜。又经过快半小时搜索和尝试,终于发现了一个精准描述我的处境的问题:wget working in terminal but not working from shell script,答案也正是我所需要的:

单击可更改

仅仅又是一个系统间的格式问题。在 Windows 上用 VS Code 新建的文件行尾序列默认是 CRLF,保存为 Linux 所需文件之前要改成 LF。又或者,直接在 SSH 里新建文件,VS Code 只用来写码,写好后粘贴到 SSH 里即可。最后贴出上面回答里引用的那个链接,有兴趣可以进一步阅读。

作者

河干鱼两

发布于

2022-09-16

更新于

2023-04-07

许可协议

评论