句点的闲时笔记

记一些自己折腾的东西

打包工具的界面不能信

折腾了一天打包。中间一直纠结某个选项在界面上找不到,后来想明白了: 与其猜界面,不如直接查产物 —— 打出来的东西里到底有什么是客观事实。

写了个小脚本把包解开看内容。第一版有个很蠢的 bug:某个字段读到空值, 而空值又不等于我要排除的那个错误值,于是判成「通过」。 一个会让人放心地用错东西的误判,比直接报错危险得多。

教训是:校验工具不要去「提取」再猜,要拿期望值去「验证」存在性。 前者会给你一个理直气壮的错误答案。

三种脚本,三套互相矛盾的编码规则

同一个目录下:.ps1 必须有 BOM,.bat 必须没有, .sh 不但不能有还必须是 LF 换行。任意一条弄错, 报出来的错误都跟真正的原因毫无关系 —— 比如中文被按错误编码解析后, 产生出的字节恰好是命令行的特殊符号,于是命令被从中间劈开。

明明记在笔记里了还是又踩了一次。所以后来干脆写成自动检查, 不再靠记性。凡是「知道了也还会犯」的事,就该交给机器。

管道里的一个静悄悄的坑

脚本里开了 pipefail,然后写了 某命令 | grep -q 关键字grep -q 一匹配到就立刻退出,上游还在往管道里写, 收到 SIGPIPE 返回 141 —— 于是明明匹配成功,整条管道却被判为失败

更麻烦的是后果:脚本据此认为某个东西「不存在」,只打了一句警告就继续跑完, 最后报「全部完成」。而实际上关键的一步根本没执行。 表面一切正常,是最难查的那种。

关于「能跑」和「跑对」

服务重启后接口返回 200,就能说明新代码生效了吗?不能 —— 旧进程照样返回 200。

后来改成看进程的运行时长:刚重启完却已经跑了几分钟,只有一种解释。 同理,报版本号要报运行中的服务吐出来的, 而不是磁盘上文件里写的 —— 读磁盘只能证明文件更新了。