这篇文章同时提供 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 /
并发送给你最好的朋友,告诉他们执行 ???
。享受吧! (开玩笑的!不要这样做!)