Skip to content

[code-review] shell-compat grep/readlink/date/stat 四臂仍是未锚定子串匹配:管道后续段的 -p/-f/-d/-c 开头 flag 误触发 [Shell Compat] 提示(#1703 修复遗漏残留) #2792

Description

@topcheer

文件和行号

  • 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions