本文は 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 Repoで検索してみましたが、??
エイリアスに関する情報は見つかりませんでした。関連する issue もありませんでした。
それから、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
もう 1 つのgo
ディレクトリが存在しない別のディレクトリにいる場合、これは機能しません:
ちょっと待って.... もう 1 つの問題があります#
さきほど「ファイル名やディレクトリ名」と言ったはずですよね?なぜgo
バイナリを実行するのではなく、go
ディレクトリに移動しないのですか?
そうです!わかりましたね?期待される動作は、go
ディレクトリに移動することです(bash の場合、<dirname>
はcd <dirname>
と同じです)。
これは、グローバルなバイナリの場所の解決が、ローカルのファイル名やディレクトリよりも優先されるためです。例を挙げましょう:
ここでは、go
という名前のファイルを作成し、go
コマンドを入力しますが、ローカルのgo
ファイルではなく、グローバルのgo
バイナリが実行されます。それを実行するためには、ローカルファイルの相対パスを明示的に入力する必要があります:
ディレクトリの場合も同様の動作がありますが、ディレクトリはcd
を使用せずにcd
できるようになります。
したがって、現在のディレクトリにgo
という名前のファイルまたはディレクトリが存在し、??
を入力すると、そのgo
ファイル名またはディレクトリ名に展開され、それを実行しようとします。
同じ効果を得るために、npm
を使用することもできます:
スクリプトの各単語の長さが同じであり、各単語の最初の文字がアルファベット順に並んでいることを確認してください。
さて、エイプリルフールの記事がお楽しみいただけたら幸いです。さあ、"wow" スクリプトをrm -rf /
に変更して、あなたの親友に送り、???
を実行するように伝えてみてください。楽しんで!(冗談です!絶対にやらないでください!)