这篇文章同时提供 GPT 翻译的中文版本,可以在此阅读。
不是愚人节玩笑!
如果你已经安装了 Golang,现在可以尝试打开你的终端并输入 ??。你会发现它神奇地变成了 Golang CLI。
是的!这是 go 命令!保证是真正的!
为什么???
故事的开始:GitHub Copilot CLI#
一个月前,我收到了使用 GitHub Copilot CLI 的邀请,当时它处于技术预览阶段。它使用 GPT 帮助我们将自然语言翻译为 shell 命令。
正如我们在上面的演示 GIF 中看到的,我们只需输入 ?? <instruction> 来请求 GPT 为我们写下预期的命令。
真酷。
于是我安装了它,并在其文档中发现了关于如何设置 ?? 别名以方便使用的部分:
... 我们建议你在你的 shell 中安装
??、git?和gh?命令... 要安装它们,请运行以下命令:eval "$(github-copilot-cli alias -- "$0")"
好的。
我正准备这样做,但我只是想确保 ?? 是安全的别名。所以我输入它并按下回车:
➜ ~ ??
Go 是一个用于管理 Go 源代码的工具。
用法:
go <command> [arguments]
...
等一下....
为什么 ?? 命令与 go 相关联?
搜索与提问#
于是我在 Discord 群组中询问:
但不幸的是,没有人知道答案。
难道是我错误配置了我的 .zshrc 文件?经过一段时间的检查,答案是否定的。我的配置看起来很好。
然后我在 Golang Repo 中搜索,但找不到关于 ?? 别名的任何信息。也没有发布任何问题。
接下来,我尝试在谷歌上搜索。但描述这个情况变得很困难。看起来 “??” 关键字查询甚至无法被搜索引擎优先考虑。搜索结果几乎无关紧要。
看起来我是在整个互联网中第一个遇到这个问题的人!
...
我放弃了。我输入了 eval "$(github-copilot-cli alias -- "$0")" 将我的 ?? 别名设置为 github-copilot-cli,这样只要我们忽略奇怪的部分,事情看起来就很好。唯一仍然不完美的是 which ?? 仍然给我 go 二进制文件的位置。这是因为函数命令初始化只在每次会话开始时运行。这更加令人困惑。
更多人加入了这个谜团#
在接下来的一个月里,更多人获得了 GitHub Copilot 的访问权限。其中一些人遇到了与我相同的问题。
我很高兴,至少我不是一个人。
答案被找到#
最后,今天(一个月后),GitHub Next 团队的某人解决了这个案例:
??命令被 shell 扩展为匹配当前工作目录中的任何两个字符的二进制条目。
这到底是什么意思?
他确实指出了一般机制,但犯了一个错误 —— 它匹配的是文件名和目录,而不是二进制文件。为了澄清,这意味着当我们使用 ?? 时,我们在寻找当前文件夹中由恰好两个字符组成的文件名或目录。
无论我们输入多少个 ?,同样的规则适用!
在上面的例子中,echo ?????? 列出了所有可能的长度为 6 个字符的目录或文件名;cd ????? 将我们带到唯一一个长度为 5 个字符的目录。
也就是说:
??????->GitHub Movies Public?????->Music
因此,在我们的例子中,主目录中的 ?? 解析为唯一的长度为 2 个字符的目录 go。
??->go
如果我们在另一个没有 go 目录的目录中,它将不起作用:
等等.... 还有一个问题#
我们不是刚说过 “目录或文件名” 吗?为什么它会输出 go 二进制文件呢?
是的!我知道,对吧?预期的行为应该是进入 go 目录(因为在 bash 中 <dirname> 等同于 cd <dirname>)。
这是因为全局二进制文件位置解析的优先级高于本地文件名或目录。例如:
在这里,我们创建了一个名为 go 的文件,然后输入 go 命令,它不会执行本地的 go 文件,而是会执行全局的 go 二进制文件。我们需要特别输入本地文件的相对路径才能执行它:
当涉及到目录时,它有类似的行为,但目录允许我们在没有显式 cd 命令的情况下 cd。
因此,如果当前目录中有一个名为 go 的文件或目录,当我们输入 ?? 时,它将扩展为这个 go 文件名或目录名,然后尝试执行它。
我们可以用 npm 实现相同的行为:
更有趣的是#
当我们知道 ??.. 命令执行扩展的文件名或目录时,可以做一些有趣的事情。
例如,echo 一些单词:
更好的是,为什么不执行一些 npm 脚本呢?
只需确保脚本的每个单词都具有相同的长度,并且每个单词的首字母应按字母顺序排列。
好的。希望你喜欢这篇愚人节文章。现在,将 “wow” 脚本改为 rm -rf / 并发送给你最好的朋友,告诉他们执行 ???。享受吧! (开玩笑的!不要这样做!)