本文は GPT-4 によって翻訳されました。元の記事は英語版で、こちらで英語版をご覧いただけます。
これはエイプリルフールの冗談ではありません!
もし Go をインストールしている場合、ターミナルを開いて??
と入力してみてください。すると、それが不思議なほど Go の CLI に変わっていることに気付くでしょう。
そうです!これは本当にgo
コマンドです!まさに本物です。
なぜこんなことが起こるのでしょうか?
物語の始まり:GitHub Copilot CLI#
1 ヶ月前、私は GitHub Copilot CLI の招待を受け取りました。当時はまだテクニカルプレビュー段階でした。これは GPT を使用して自然言語をシェルコマンドに変換するためのものです。
上記のデモ GIF のように、私たちは単に?? <instruction>
と入力するだけで、GPT が私たちのために望ましいコマンドを書いてくれます。
かなりクールです。
それで私はそれをインストールし、そのドキュメントで使用を容易にするために??
エイリアスを設定する方法について読みました:
... シェルで
??
、git?
、およびgh?
コマンドをインストールすることをお勧めします... これらをインストールするには、次のコマンドを実行します:eval "$(github-copilot-cli alias -- "$0")"
わかりました。
私はそれをやろうとしていましたが、突然??
が安全なエイリアスであることを確認したかったので、??
を入力して Enter キーを押しました:
➜ ~ ??
Go is a tool for managing Go source code.
Usage:
go <command> [arguments]
...
待って....
なぜ??
コマンドがgo
にリンクされているのですか?
検索と質問#
それで、私は Discord グループで質問しました:
しかし、残念ながら、誰も答えを知りませんでした。
もしかして、私の.zshrc
ファイルの設定が間違っているのでしょうか?しばらくチェックしましたが、答えはノーでした。私の設定は正しく見えました。
次に、Golang のリポジトリで検索しましたが、??
エイリアスに関する情報は見つかりませんでした。関連する問題もありませんでした。
それから、Google で検索してみました。しかし、この問題を説明するのは非常に困難でした。検索エンジンがキーワードクエリを優先的に処理できないようです。検索結果はほとんど関係ありませんでした。
私がこの問題に直面した最初の人間であるようです!
...
私はあきらめました。eval "$(github-copilot-cli alias -- "$0")"
と入力して私の??
エイリアスをgithub-copilot-cli
に設定しました。奇妙な部分を無視すれば、他のすべてはうまくいっているように見えます。唯一の問題は、which ??
が私にgo
バイナリの場所を返すことですが、関数コマンドの初期化はセッションを起動するたびに実行されるため、これはますます混乱を招きます。
もっと多くの人々がこの謎に参加#
その後の 1 ヶ月で、多くの他の人々も GitHub Copilot へのアクセス権を取得しました。その中には私と同じ問題に直面した人もいました。
少なくとも私だけではないことがわかって安心しました。
答えがついに見つかりました#
ついに、今日(1 ヶ月後)、この問題が GitHub Next チームのメンバーによって解決されました:
??
コマンドは、シェルで現在の作業ディレクトリ内の任意の 2 文字のバイナリエントリとして展開されます。
これはどういう意味ですか?
彼は大まかなメカニズムを指摘しましたが、間違いを comit しました - ??
はファイル名やディレクトリではなく、2 文字で構成されるファイル名やディレクトリ名を探しているということです。
?
の数に関係なく、同じルールが適用されます!
上記の例では、echo ??????
は 6 文字のすべての可能性のあるディレクトリ名やファイル名をリストアップします。cd ?????
は 5 文字の唯一のディレクトリに移動します。
つまり:
??????
->GitHub Movies Public
?????
->Music
したがって、私たちの例では、ホームディレクトリにある??
は、2 文字のディレクトリであるgo
に展開されます。
??
->go
別のgo
ディレクトリが存在しない別のディレクトリにいる場合、これは機能しません:
ちょっと待って.... もう 1 つ問題があります#
さっき「ファイル名やディレクトリ名」と言ったはずですよね?なぜgo
バイナリを実行するのではなく、go
ディレクトリに移動しないのですか?
そうです!わかっていますよね?期待される動作は、go
ディレクトリに移動することです(bash では、<dirname>
はcd <dirname>
と同じです)。
これは、グローバルバイナリの場所の解決が、ローカルのファイル名やディレクトリよりも優先されるためです。例を挙げると:
ここでは、go
という名前のファイルを作成し、go
コマンドを入力しますが、ローカルのgo
ファイルではなく、グローバルのgo
バイナリが実行されます。それを実行するためには、明示的なローカルファイルの相対パスを入力する必要があります:
ディレクトリの場合も同様の動作がありますが、ディレクトリはcd
を使用せずにcd
することができます。
したがって、現在のディレクトリにgo
という名前のファイルまたはディレクトリがある場合、??
を入力すると、そのgo
ファイル名またはディレクトリ名が展開され、それを実行しようとします。
同じ効果を得るために、npm
を使用することもできます:
スクリプトの各単語の長さが同じであり、各単語の最初の文字がアルファベット順に並んでいることを確認してください。
さて、エイプリルフールの記事を楽しんでいただけたでしょうか。さあ、"wow" スクリプトをrm -rf /
に変更して、最高の友達に送って、彼らに???
を実行するように伝えましょう。楽しんで!(冗談です!絶対にやらないでください!)