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 のリポジトリで検索しましたが、??エイリアスに関する情報は見つかりませんでした。関連する問題もありませんでした。

それから、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

別の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 /に変更して、最高の友達に送って、彼らに???を実行するように伝えましょう。楽しんで!(冗談です!絶対にやらないでください!)

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