先说一下,我的 shell 水平就是会用 pipe,懂 $() 做变量插值,稍微会写点最简单的 grep。sed awk 的水平。用 bash 来写 shell 脚本,写控制流的能力是完全没有。
于是用 AI (claude code 配合 sonnet 4) 写了一个 bash 的小脚本,总共代码量 400 多行,一行代码没写,claude code 完成的一气呵成,没什么问题。
但是接下来问题发生了,这个脚本在 macOS 上运行正常,在 linux 上就运行失败,而且是 silently fail 一点报错信息都没有 (也就是错误的原因根本就没有被 claude code 生成的错误检查代码检查到)。
于是我就开始问 AI 叫 AI 去 debug 了、和它说了测试命令 (在 linux 上失败 在 macOS 上不会失败的命令)。然后 AI 就说可能是 silently 失败的可能原因是 set -e 导致的,然后就开始吭哧吭哧的改代码,加了一堆防御性的代码,但是改的是一坨狗屎,防御性代码全部都加错位置。总共就 400 多行的小脚本,烧了我大几万的 token,我还重启了好几个 session 改了好多次,就没一次改对地方。
最后没办法,我自己开始看,首先自己先确定上 bash 版本不一致的原因 (macos 自带的 bash 非常古老),用 brew 安装了 bash 最新版以后就遇到了和 linux 一样的 silent fail 的问题。然后自己读了一遍代码,凭借自己浅薄的 bash 水平,就定位到了如下的这段代码:
@@ 106,9 106,14 @@ done
validate_args() {
# Count active modes
local mode_count=0
- [[ "$USE_TAB" == true ]] && ((mode_count++))
- [[ "$USE_FLOATING" == true ]] && ((mode_count++))
- [[ "$USE_PANE" == true ]] && ((mode_count++))
+
+ if [[ "$USE_TAB" == true ]]; then
+ mode_count=$((mode_count + 1))
+ elif [[ "$USE_FLOATING" == true ]]; then
+ mode_count=$((mode_count + 1))
+ elif [[ "$USE_PANE" == true ]]; then
+ mode_count=$((mode_count + 1))
+ fi
靠自己定位到了这段代码以后,我就让 AI 把代码从原先的类三目运算符的写法改成 if-else 的写法,是的我连 bash if-else 都不会写。然后代码就搞好了。
我还把这段 diff 丢给了 AI,让他解释一下为什么这么改,就不会让 set -e silently 报错了。然后 AI 就给了解释:
When a variable like `$USE_TAB` is `false` (or unset), the test `[[
"$USE_TAB" == true ]]` evaluates to false (exit code 1). This non-zero
exit code triggered `set -e`, causing the script to terminate.
This commit refactors the logic to use an `if/elif/else` block. In this
structure, the test conditions `[[ ... ]]` are part of the control flow
and their non-zero exit status (when false) does not trigger `set -e`.
This ensures that the script always proceeds to the next execution flow.
所以为啥让你解释你解释的头头是道,让你 debug 半天找不到这个位置呢?
经过这件事情,我对 AI 对代码的理解能力产生了巨大的震惊。我用的是 claudecode + sonnet 4,已经是目前最好的技术栈了。并且 AI 写 bash 的能力绝对远远强于我。
那么问题来了,为什么连最基本的 bash 语法都不太懂的我,都能定位到这段错误代码?而 AI 写 bash 的能力强我一万倍,却定位不到这段代码?而且这段代码的错误原因不涉及到任何的业务逻辑,是一个纯粹的 bash 语法问题。
此前根据我的经验,AI 在理解复杂的业务逻辑或者长链路的追踪上很可能会抓瞎,这是我完全理解的。但是我没办法理解,这么熟练写 bash 脚本的 AI,竟然会找不到这么低级的一个错误。在我看来,如果是一个会写 bash 的人类,应该能够几秒钟就定位到这个 bug。