Songkeys

Songkeys

Hello. Songkeys here~ :D
twitter

一个神秘的案件解决了 - 当我在终端输入 `??` 时,Golang CLI 弹出了

这篇文章同时提供 GPT 翻译的中文版本,可以在此阅读

不是愚人节玩笑!

如果你已经安装了 Golang,现在可以尝试打开你的终端并输入 ??。你会发现它神奇地变成了 Golang CLI。

image

是的!这是 go 命令!保证是真正的!

image

为什么???

故事的开始:GitHub Copilot CLI#

一个月前,我收到了使用 GitHub Copilot CLI 的邀请,当时它处于技术预览阶段。它使用 GPT 帮助我们将自然语言翻译为 shell 命令。

image

正如我们在上面的演示 GIF 中看到的,我们只需输入 ?? <instruction> 来请求 GPT 为我们写下预期的命令。

真酷。

于是我安装了它,并在其文档中发现了关于如何设置 ?? 别名以方便使用的部分:

... 我们建议你在你的 shell 中安装 ??git?gh? 命令... 要安装它们,请运行以下命令:

eval "$(github-copilot-cli alias -- "$0")"

好的。

我正准备这样做,但我只是想确保 ?? 是安全的别名。所以我输入它并按下回车:

➜ ~ ??

Go 是一个用于管理 Go 源代码的工具。

用法:

	go <command> [arguments]
...

等一下....

为什么 ?? 命令与 go 相关联?

搜索与提问#

于是我在 Discord 群组中询问:

image

但不幸的是,没有人知道答案。

难道是我错误配置了我的 .zshrc 文件?经过一段时间的检查,答案是否定的。我的配置看起来很好。

然后我在 Golang Repo 中搜索,但找不到关于 ?? 别名的任何信息。也没有发布任何问题。

接下来,我尝试在谷歌上搜索。但描述这个情况变得很困难。看起来 “??” 关键字查询甚至无法被搜索引擎优先考虑。搜索结果几乎无关紧要。

image

看起来我是在整个互联网中第一个遇到这个问题的人!

...

我放弃了。我输入了 eval "$(github-copilot-cli alias -- "$0")" 将我的 ?? 别名设置为 github-copilot-cli,这样只要我们忽略奇怪的部分,事情看起来就很好。唯一仍然不完美的是 which ?? 仍然给我 go 二进制文件的位置。这是因为函数命令初始化只在每次会话开始时运行。这更加令人困惑。

image

更多人加入了这个谜团#

在接下来的一个月里,更多人获得了 GitHub Copilot 的访问权限。其中一些人遇到了与我相同的问题。

image image

我很高兴,至少我不是一个人。

答案被找到#

最后,今天(一个月后),GitHub Next 团队的某人解决了这个案例:

image

?? 命令被 shell 扩展为匹配当前工作目录中的任何两个字符的二进制条目。

这到底是什么意思?

他确实指出了一般机制,但犯了一个错误 —— 它匹配的是文件名和目录,而不是二进制文件。为了澄清,这意味着当我们使用 ?? 时,我们在寻找当前文件夹中由恰好两个字符组成的文件名或目录。

无论我们输入多少个 ?,同样的规则适用!

image

在上面的例子中,echo ?????? 列出了所有可能的长度为 6 个字符的目录或文件名;cd ????? 将我们带到唯一一个长度为 5 个字符的目录。

也就是说:

  • ?????? -> GitHub Movies Public
  • ????? -> Music

因此,在我们的例子中,主目录中的 ?? 解析为唯一的长度为 2 个字符的目录 go

  • ?? -> go

如果我们在另一个没有 go 目录的目录中,它将不起作用:

image

等等.... 还有一个问题#

我们不是刚说过 “目录或文件名” 吗?为什么它会输出 go 二进制文件呢

是的!我知道,对吧?预期的行为应该是进入 go 目录(因为在 bash 中 <dirname> 等同于 cd <dirname>)。

这是因为全局二进制文件位置解析的优先级高于本地文件名或目录。例如:

image

在这里,我们创建了一个名为 go 的文件,然后输入 go 命令,它不会执行本地的 go 文件,而是会执行全局的 go 二进制文件。我们需要特别输入本地文件的相对路径才能执行它:

image

当涉及到目录时,它有类似的行为,但目录允许我们在没有显式 cd 命令的情况下 cd

因此,如果当前目录中有一个名为 go 的文件或目录,当我们输入 ?? 时,它将扩展为这个 go 文件名或目录名,然后尝试执行它

我们可以用 npm 实现相同的行为:

image

更有趣的是#

当我们知道 ??.. 命令执行扩展的文件名或目录时,可以做一些有趣的事情。

例如,echo 一些单词:

image

更好的是,为什么不执行一些 npm 脚本呢?

image

只需确保脚本的每个单词都具有相同的长度,并且每个单词的首字母应按字母顺序排列。

好的。希望你喜欢这篇愚人节文章。现在,将 “wow” 脚本改为 rm -rf / 并发送给你最好的朋友,告诉他们执行 ???。享受吧! (开玩笑的!不要这样做!)

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。