Songkeys

Songkeys

Hello. Songkeys here~ :D
twitter

谜案侦破-私はターミナルに `??` を入力した後、Golangが表示されました

本文は GPT-4 によって翻訳されました。元の英語版はこちらでご覧いただけます

これはエイプリルフールの冗談ではありません!

もし Go をインストールしている場合、ターミナルを開いて??と入力してみてください。すると、それが不思議なほど Go の CLI に変わっていることに気づくでしょう。

image

そうです!これは本当にgoコマンドです!本物です。

image

なぜこんなことになったのでしょうか?

はじまりの物語:GitHub Copilot CLI#

1 ヶ月前、私は GitHub Copilot CLI の招待を受け取りました。当時、それは技術プレビュー段階にありました。それは GPT を使用して自然言語をシェルコマンドに変換するのに役立ちます。

image

上記のデモ 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 のグループで質問しました:

image

しかし、残念ながら、誰も答えを知りませんでした。

.zshrcファイルで何か設定を間違えたのでしょうか?しばらくチェックしましたが、答えはノーでした。私の設定は正しく見えました。

次に、Golang Repoで検索してみましたが、??エイリアスに関する情報は見つかりませんでした。関連する issue もありませんでした。

それから、Google で検索してみました。しかし、この問題を説明するのは非常に難しくなりました。検索エンジンがキーワードクエリ??を優先的に処理できないようです。検索結果はほとんど関連がありませんでした。

image

私がこの問題に直面した最初の人間だということです!

...

私はあきらめました。eval "$(github-copilot-cli alias -- "$0")"と入力して、??エイリアスをgithub-copilot-cliに設定しました。奇妙な部分を無視すれば、他のすべてはうまくいっているようです。唯一の問題は、which ??が私に go バイナリの場所を返すことです。関数コマンドの初期化はセッションの開始時にのみ実行されるため、これはますます混乱を招きます。

image

さらに多くの人々がこの謎に参加#

その後の 1 ヶ月で、多くの他の人々も GitHub Copilot へのアクセス権を取得しました。その中には私と同じ問題に直面した人もいました。

image image

少なくとも私だけではないということがわかってうれしいです。

答えがついに見つかりました#

ついに、今日(1 ヶ月後)になって、この問題を解決した GitHub Next チームのメンバーが現れました:

image

??コマンドは、シェル内で現在の作業ディレクトリに存在する 2 文字のバイナリエントリに展開されます。

これはどういう意味ですか?

彼は大まかなメカニズムを指摘しましたが、間違いを comit しました - ??はファイル名やディレクトリ名ではなく、2 文字で構成されるファイル名やディレクトリ名を探しているということです。

?の数に関係なく、同じルールが適用されます!

image

上記の例では、echo ??????は 6 文字のすべての可能性のあるディレクトリ名やファイル名をリストアップします。cd ?????は 5 文字の唯一のディレクトリに移動します。

つまり:

  • ?????? -> GitHub Movies Public
  • ????? -> Music

したがって、私たちの例では、ホームディレクトリにある??は、2 文字のディレクトリであるgoに展開されます。

  • ?? -> go

もう 1 つのgoディレクトリが存在しない別のディレクトリにいる場合、これは機能しません:

image

ちょっと待って.... もう 1 つの問題があります#

さきほど「ファイル名やディレクトリ名」と言ったはずですよね?なぜgoバイナリを実行するのではなく、goディレクトリに移動しないのですか

そうです!わかりましたね?期待される動作は、goディレクトリに移動することです(bash の場合、<dirname>cd <dirname>と同じです)。

これは、グローバルなバイナリの場所の解決が、ローカルのファイル名やディレクトリよりも優先されるためです。例を挙げましょう:

image

ここでは、goという名前のファイルを作成し、goコマンドを入力しますが、ローカルのgoファイルではなく、グローバルのgoバイナリが実行されます。それを実行するためには、ローカルファイルの相対パスを明示的に入力する必要があります:

image

ディレクトリの場合も同様の動作がありますが、ディレクトリはcdを使用せずにcdできるようになります。

したがって、現在のディレクトリにgoという名前のファイルまたはディレクトリが存在し、??を入力すると、そのgoファイル名またはディレクトリ名に展開され、それを実行しようとします

同じ効果を得るために、npmを使用することもできます:

image

スクリプトの各単語の長さが同じであり、各単語の最初の文字がアルファベット順に並んでいることを確認してください。

さて、エイプリルフールの記事がお楽しみいただけたら幸いです。さあ、"wow" スクリプトをrm -rf /に変更して、あなたの親友に送り、???を実行するように伝えてみてください。楽しんで!(冗談です!絶対にやらないでください!)

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。