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 / 並發送給你最好的朋友,告訴他們執行 ???。享受吧! (開玩笑的!不要這樣做!)

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。