<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Git Bash on 我的博客</title><link>https://diankao.github.io/tags/git-bash/</link><description>Recent content in Git Bash on 我的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 01 Sep 2026 10:27:17 +0800</lastBuildDate><atom:link href="https://diankao.github.io/tags/git-bash/index.xml" rel="self" type="application/rss+xml"/><item><title>删不掉的 nul：AI 编程助手在 Windows 上的一次跨平台口误</title><link>https://diankao.github.io/posts/nul-ghost-file/</link><pubDate>Tue, 01 Sep 2026 10:27:17 +0800</pubDate><guid>https://diankao.github.io/posts/nul-ghost-file/</guid><description>&lt;p&gt;用 AI 编程助手（Claude Code、ZCode 这类 agent）在 Windows 上干活的人，迟早会在某个项目根目录捡到一个幽灵：一个 0 字节的文件，名字叫 &lt;code&gt;nul&lt;/code&gt;。&lt;code&gt;git status&lt;/code&gt; 里躺着个 &lt;code&gt;?? nul&lt;/code&gt;，资源管理器里看得见，右键删除却报&amp;quot;找不到该项目&amp;quot;。看得见，删不掉，标准的幽灵文件。&lt;/p&gt;
&lt;p&gt;它不是病毒，不是 bug，是 AI 助手的一句&lt;strong&gt;跨平台口误&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="口误发生在哪一句"&gt;口误发生在哪一句&lt;/h2&gt;
&lt;p&gt;AI 助手在 Windows 上跑命令，走的通常是 Git Bash——一个 POSIX 语义的 shell。而模型执行命令时有个职业习惯：把无关的日志和报错重定向丢弃，保持输出干净。丢弃输出的写法在两个世界长得不一样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Windows cmd： some.exe &amp;gt;nul （nul 是设备，输出进了黑洞）
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bash： some.exe &amp;gt;/dev/null （/dev/null 是设备，输出进了黑洞）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;模型识别到宿主是 Windows，出于好意切了 cmd 方言，写下 &lt;code&gt;&amp;gt;nul&lt;/code&gt;。但实际执行这句的 shell 是 Git Bash。在 Bash 眼里，&lt;code&gt;nul&lt;/code&gt; 不是设备，就是一个普通的文件名——重定向的目标文件不存在时 Bash 会怎么办？创建它。于是磁盘上多了这么个东西。&lt;/p&gt;
&lt;p&gt;一句字面级别的口误：&lt;strong&gt;语法是 cmd 的，解释器是 Bash 的&lt;/strong&gt;。两边单独看都没错，拼在一起就生成了一个不属于任何一方意图的文件。&lt;/p&gt;
&lt;h2 id="为什么看得见删不掉"&gt;为什么看得见、删不掉&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;nul&lt;/code&gt; 是 DOS 时代的设备保留名，同一家族还有 &lt;code&gt;con&lt;/code&gt;、&lt;code&gt;prn&lt;/code&gt;、&lt;code&gt;aux&lt;/code&gt;、&lt;code&gt;com1&lt;/code&gt; 到 &lt;code&gt;com9&lt;/code&gt;、&lt;code&gt;lpt1&lt;/code&gt; 到 &lt;code&gt;lpt9&lt;/code&gt;。Windows 的 Win32 层在解析路径时，会把出现在文件名位置上的这些名字&lt;strong&gt;别名到设备对象&lt;/strong&gt;上。所以资源管理器、&lt;code&gt;del nul&lt;/code&gt;、以及一切走 Win32 路径的程序，操作这个名字时碰到的其实是设备，不是文件——&amp;ldquo;找不到该项目&amp;quot;就是这么来的：它找的确实不是那个文件。&lt;/p&gt;</description></item></channel></rss>