docs: 补两条本机工具链坑位(Grep 不搜 .workbuddy、Edit 静默不生效需回读)

This commit is contained in:
夏犀麟 2026-09-14 01:11:38 +08:00
parent b0b40aabfc
commit dbb54f4134

View File

@ -32,6 +32,8 @@
- **经 `ssh.exe` 执行多行脚本会踩转义坑2026-09-13 实测)**:把多行 here-string 直接当参数传给 `ssh.exe`,远程 bash 解析到 `(` 等字符会报 `syntax error near unexpected token '('`**而且报错前的行已经执行了**,导致状态半途而废(证书只搬了一半)。**可靠做法**:本地写 `.sh` 文件(用 `-replace "`r`n","`n"` 强制 LF + `WriteAllText` UTF-8 无 BOM**单独** `scp` 上传 → `ssh "chmod +x /tmp/x.sh && /tmp/x.sh"` 执行。注意 `echo <b64> | base64 -d | bash` 会被 PowerShell 工具安全策略直接拦截("Spawning a non-PowerShell shell")。 - **经 `ssh.exe` 执行多行脚本会踩转义坑2026-09-13 实测)**:把多行 here-string 直接当参数传给 `ssh.exe`,远程 bash 解析到 `(` 等字符会报 `syntax error near unexpected token '('`**而且报错前的行已经执行了**,导致状态半途而废(证书只搬了一半)。**可靠做法**:本地写 `.sh` 文件(用 `-replace "`r`n","`n"` 强制 LF + `WriteAllText` UTF-8 无 BOM**单独** `scp` 上传 → `ssh "chmod +x /tmp/x.sh && /tmp/x.sh"` 执行。注意 `echo <b64> | base64 -d | bash` 会被 PowerShell 工具安全策略直接拦截("Spawning a non-PowerShell shell")。
- **多源文件 `scp` 不可靠2026-09-13 实测)**:一次 `scp a b c d e host:/tmp/` 只落地了其中 2 个,且**没有任何报错**。**每次只 scp 一个文件**;脚本内用 `for` + `[ -f ]` 判断做幂等补齐,避免重复上传。 - **多源文件 `scp` 不可靠2026-09-13 实测)**:一次 `scp a b c d e host:/tmp/` 只落地了其中 2 个,且**没有任何报错**。**每次只 scp 一个文件**;脚本内用 `for` + `[ -f ]` 判断做幂等补齐,避免重复上传。
- **远程脚本一律写成幂等**`if [ -f ]` 判断后再 `mv -f`),因为 SSH 调用可能被沙箱拦截/用户误拒而中断,重跑不能出错。 - **远程脚本一律写成幂等**`if [ -f ]` 判断后再 `mv -f`),因为 SSH 调用可能被沙箱拦截/用户误拒而中断,重跑不能出错。
- **Grep 搜不到 `.workbuddy/` 里的内容2026-09-14 实测)**Grep 工具ripgrep**默认跳过隐藏文件与目录**`.workbuddy/`、`.gitea/` 这类点开头的目录整个不在搜索范围内 —— 搜项目源码正常,搜 memory/CHANGELOG 会「一个都不匹配」。**别把它当成「文件没改成功」的证据**(曾据此误判为编辑丢失):验证 `.workbuddy/` 下的改动必须用 Read 直接读。
- **Edit 会静默不生效**:本项目上出现过多次(尤其目标串含 `_` 下划线的注释、或上下文给得太少时),工具报成功但文件没变。**改完必须回读验证** —— `src/` 下用 Grep`.workbuddy/` 下用 Read见上一条
- **别用 `echo $LASTEXITCODE` 穿透 ssh 取远端退出码2026-09-13 实测踩坑)**`$LASTEXITCODE` 是 PowerShell 自动变量,在**本地**双引号字符串里就被展开成空串,远端实际收到的是 `echo DONE`,于是「脚本明明失败了却看到一个成功的回声」。**可靠做法**:远端 `sh /tmp/x.sh > /tmp/x.log 2>&1`,再 `base64 -w0 /tmp/x.log` 回传、本地解码落盘后用 Read 看base64 还能顺带规避 Windows 控制台按 GBK 解 UTF-8 造成的乱码)。 - **别用 `echo $LASTEXITCODE` 穿透 ssh 取远端退出码2026-09-13 实测踩坑)**`$LASTEXITCODE` 是 PowerShell 自动变量,在**本地**双引号字符串里就被展开成空串,远端实际收到的是 `echo DONE`,于是「脚本明明失败了却看到一个成功的回声」。**可靠做法**:远端 `sh /tmp/x.sh > /tmp/x.log 2>&1`,再 `base64 -w0 /tmp/x.log` 回传、本地解码落盘后用 Read 看base64 还能顺带规避 Windows 控制台按 GBK 解 UTF-8 造成的乱码)。
- **`set -e` + 写死的路径 = 静默失败**`kuma-statuspage.sh` 曾把来源文件写死成 `/tmp/wb_kuma_statuspage.sql`,而上传的是 `/tmp/kuma-statuspage.sql`,脚本在第一步就退出,**日志只有一行「缺少 …」,看起来像什么都没发生**。远程脚本内部一律用 `$(dirname "$0")/<同名文件>` 推导,再退到 `/tmp/<同名文件>` 兜底;且上传时保证「脚本名.sh ↔ 同名.sql」成对。 - **`set -e` + 写死的路径 = 静默失败**`kuma-statuspage.sh` 曾把来源文件写死成 `/tmp/wb_kuma_statuspage.sql`,而上传的是 `/tmp/kuma-statuspage.sql`,脚本在第一步就退出,**日志只有一行「缺少 …」,看起来像什么都没发生**。远程脚本内部一律用 `$(dirname "$0")/<同名文件>` 推导,再退到 `/tmp/<同名文件>` 兜底;且上传时保证「脚本名.sh ↔ 同名.sql」成对。
- **SSH 被沙箱拦截时不一定要重试**:先找**公网可达的旁路**做验证。例如 Kuma 的 `/api/status-page/<slug>``status.xpcool.com` 上匿名可达,直接 HTTPS 查就能判断状态页是否建成,省一次权限弹窗。真的需要读远端日志时,再向用户说明并请求重新授权(授权后原命令即可重跑)。 - **SSH 被沙箱拦截时不一定要重试**:先找**公网可达的旁路**做验证。例如 Kuma 的 `/api/status-page/<slug>``status.xpcool.com` 上匿名可达,直接 HTTPS 查就能判断状态页是否建成,省一次权限弹窗。真的需要读远端日志时,再向用户说明并请求重新授权(授权后原命令即可重跑)。