文件和行号
internal/tool/shell_compat_intel.go
- grep -P 臂:line 72-77
- readlink -f 臂:line 63-67
- date -d 臂:line 81-86
- stat -c 臂:line 90-95
问题描述
#1703 明确点名 "the #868 prefix-anchoring fix missed five commands (readlink/grep/date/stat/sort)",其修复 commit e6f4229a7 只修了 xargs -r 和 sort -V 两臂。grep、readlink、date、stat 四臂至今仍是 HasPrefix(cmd, "<cmd> ") && strings.Contains(cmd, " -x") 的未锚定形式。由于 diagnoseShellCompat 先把 cmd strings.ToLower,大写 -P/-F/-D/-C 同样命中。
触发场景
macOS 上任一失败命令(两个调用点 run_command.go:791、command_jobs.go:368 均在失败路径):
grep -q error app.log | curl -P 0 ftp://example.com — curl 失败;cmd 小写后 " -p" 命中 curl 的 -P,返回 [Shell Compat] grep -P (PCRE) is GNU-only,命令里根本没有 grep -P
- 更常见:
grep -q TODO file && find . -name '*.log' -print 失败时 " -print" 含 " -p" 前缀,同样误触发
- readlink 臂:
readlink link | sort -f(BSD 合法 fold-case flag)失败时误报 readlink -f 提示
预期行为 vs 实际行为
- 预期:flag 检测锚定到 grep/readlink/date/stat 调用自身的 token(同 xargs 臂的按
|/&&/; 分段 + 精确 token 匹配)
- 实际:管道/链式命令后续任何段的
-p*/-f*/-d*/-c* 开头 flag 都会误触发,向 agent 注入错误的修复建议(可能诱导把正常 grep 换成 -E 引入二次错误)
修复建议
参照 xargs -r 臂模式:按 |、&&、; 分段,仅检查以 grep/readlink/date/stat 开头的段内 token 精确等于 -p/-f/-d/-c(或对应长选项 --perl-regexp/--canonicalize 等)。
严重程度
medium(独立复核 subagent 确认:仅失败路径提示,不改执行结果,但触发面广且 #1703 已点名未修,属修复遗漏残留)
Ref: #868 #1342 #1703 #2607
文件和行号
internal/tool/shell_compat_intel.go问题描述
#1703 明确点名 "the #868 prefix-anchoring fix missed five commands (readlink/grep/date/stat/sort)",其修复 commit
e6f4229a7只修了 xargs -r 和 sort -V 两臂。grep、readlink、date、stat 四臂至今仍是HasPrefix(cmd, "<cmd> ") && strings.Contains(cmd, " -x")的未锚定形式。由于diagnoseShellCompat先把 cmdstrings.ToLower,大写-P/-F/-D/-C同样命中。触发场景
macOS 上任一失败命令(两个调用点
run_command.go:791、command_jobs.go:368均在失败路径):grep -q error app.log | curl -P 0 ftp://example.com— curl 失败;cmd 小写后" -p"命中 curl 的-P,返回[Shell Compat] grep -P (PCRE) is GNU-only,命令里根本没有 grep -Pgrep -q TODO file && find . -name '*.log' -print失败时" -print"含" -p"前缀,同样误触发readlink link | sort -f(BSD 合法 fold-case flag)失败时误报 readlink -f 提示预期行为 vs 实际行为
|/&&/;分段 + 精确 token 匹配)-p*/-f*/-d*/-c*开头 flag 都会误触发,向 agent 注入错误的修复建议(可能诱导把正常 grep 换成 -E 引入二次错误)修复建议
参照 xargs -r 臂模式:按
|、&&、;分段,仅检查以 grep/readlink/date/stat 开头的段内 token 精确等于-p/-f/-d/-c(或对应长选项--perl-regexp/--canonicalize等)。严重程度
medium(独立复核 subagent 确认:仅失败路径提示,不改执行结果,但触发面广且 #1703 已点名未修,属修复遗漏残留)
Ref: #868 #1342 #1703 #2607