この記事には、GPT 翻訳された中国語版もあります。この文章はこちらで読むことができます。
エイプリルフールのジョークではありません!
Golang をインストールしている場合は、今すぐターミナルを開いて ?? と入力してみてください。魔法のように Golang CLI に変わることがわかります。
はい!それは go コマンドです!本物であることが保証されています!
なぜ???
物語の始まり:GitHub Copilot CLI#
1 ヶ月前、私は GitHub Copilot CLI を使用する招待を受けました。これは技術プレビュー中でした。これは、GPT を使用して自然言語をシェルコマンドに翻訳するのを手伝ってくれます。
上のデモ GIF でわかるように、私たちは ?? <instruction> と入力するだけで、GPT に期待されるコマンドを書いてもらうことができます。
かなりクールです。
それで、私はそれをインストールし、便利さのために ?? エイリアスを設定する方法についてのドキュメントのこのセクションに出くわしました:
... 私たちは、シェルに
??、git?、およびgh?コマンドをインストールすることをお勧めします... それらをインストールするには、次のコマンドを実行してください:eval "$(github-copilot-cli alias -- "$0")"
わかりました。
私はこれをしようとしていましたが、?? がエイリアスとして安全であることを確認したかっただけです。そこで、私はそれを入力してエンターを押しました:
➜ ~ ??
GoはGoソースコードを管理するためのツールです。
使用法:
go <command> [arguments]
...
ちょっと待って....
なぜ ?? コマンドが go にリンクされているのですか?
検索と質問#
そこで、私はディスコードグループで質問しました:
しかし、残念ながら、誰も答えを知りませんでした。
私の .zshrc ファイルを誤って設定した可能性があるのでしょうか?しばらく確認した後、答えは「いいえ」でした。私の設定は良好に見えます。
次に、Golang リポジトリを検索しましたが、?? エイリアスに関する情報は見つかりませんでした。そして、問題も投稿されていませんでした。
次に、グーグルで検索してみました。しかし、ケースを説明するのが難しくなりました。「??」キーワードクエリは検索エンジンによって優先されないようです。検索結果はほとんど無関係です。
どうやら、私はインターネット全体でこの問題に直面した最初の人のようです!
...
私は諦めました。そして、eval "$(github-copilot-cli alias -- "$0")" を入力して ?? を github-copilot-cli にエイリアスしましたので、奇妙な部分を無視すれば物事は良好に見えます。唯一完璧でないのは、which ?? がまだ go バイナリの場所を教えてくれることです。これは、関数コマンドの初期化がセッションの開始時にのみ実行されるためです。これはさらに混乱を招きます。
謎に参加する人々#
その後の 1 ヶ月で、さらに多くの人々が GitHub Copilot にアクセスできるようになりました。そして、その中の何人かは私と同じ問題に直面しました。
私は少なくとも一人ではないことに安心しています。
答えが見つかりました#
ついに、今日(1 ヶ月後)GitHub Next チームの誰かによってこのケースが解決されました:
??コマンドは、シェルによって現在の作業ディレクトリ内の任意の 2 文字のバイナリエントリに一致するように展開されています。
それは一体何を意味するのでしょうか?
彼は一般的なメカニズムを指摘しましたが、一つの間違いを犯しました - それはファイル名とディレクトリに一致しているのではなく、バイナリに一致しています。明確にするために言うと、?? を使用すると、現在のフォルダ内で正確に 2 文字からなるファイル名またはディレクトリを探しています。
私たちが何個の ? を入力しても、同じルールが適用されます!
上の例では、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 / に変更して、親友に送信し、??? を実行するように言ってください。楽しんでください! (冗談です!こんなことはしないでください!)