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