Bashはどのようにファイル名拡張を実行するべきかをどうやって知ることができますか?

Bashはどのようにファイル名拡張を実行するべきかをどうやって知ることができますか?

と入力すると、ssh-copy-id -i ~/.ssh/ファイルTab名拡張子が一覧表示されます~/.ssh

ssh-copy-idフラグなしで-ithenを入力すると、ファイルは拡張されSpacebarません。Tab

ssh-copy-id -x、、、(無効なフラグであることに注意してください)を入力してもSpacebardファイルは拡張されません。Tab-x

Bashは、入力後にファイル拡張子をどのように"知っている"ですか-issh-copy-idBashがこれを実行できるようにプログラムをプログラムする必要がありますか?ファイル名拡張子に関するこのページとは異なるページを読みましたが、私の質問に対する答えが見つかりませんでした。 https://www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html

ヒットバージョン: GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

答え1

タブの完成はファイル名拡張とは異なります。

タブ完成インタラクティブなBashセッションのためのBash GNU Readlineの基本機能です。たとえば、変数を完成させ(try echo $SH<TAB>)、ファイル名コマンド引数も使用します。

また、bash-completionパッケージをインストールすると、に含まれるコマンドの完成がより/usr/share/bash-completion/completionsスマートになりますssh-copy-id-iフラグにはファイルが必要なので、ssh-copy-idタブを介してファイルを完成させます。そうでない場合、-iファイル提供の意味がないため、完了は行われません。

completions繰り返しますが、これはディレクトリ内のコマンドでのみ機能します。コマンドがファイルを引数として受け入れない場合、Bashfoobarbash-completionfoobar

一方、ファイル名拡張子これはPOSIXシェルの動作です。これは、シェルが対話型であるかどうかに関係なく発生します。例:コマンドに必要かどうかに関係なく、現在のディレクトリ内のすべてのファイルを展開ssh-copy-id -x *します。*

関連情報