Cygwin では `.exe` 拡張子のためコマンド引数のタブ補完が失敗する

Cygwin では `.exe` 拡張子のためコマンド引数のタブ補完が失敗する

Cygwin には、Bash がコマンド名を補完するときにファイル名の.exeサフィックスを無視する (含めない) ようにする設定オプションがありますか?


問題の説明

Cygwin システム上の Bash でタブ補完を使用してコマンド名を補完する場合、.exeコマンド名に拡張子が追加されます。たとえば、 と入力して を押すopensと、Tabコマンドが に補完されますopenssl.exe

コマンドは正常に実行されます(MS Windowsでは.exeコマンド実行時に拡張子はオプションです)が、問題は_openssl()bash-completionopensslパッケージは、 ではなく の引数の補完のみを提供するように構成されていますopenssl.exe。例:

$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification

同じ問題は、全て実行可能なコマンド。

現在、私は Bash を Emacs モードで Readline 編集用に構成して使用しているため、コマンドの引数の入力を開始する前に、 を押してEsc2 回Backspace押してサフィックスを削除できます.exe。理想的には、コマンドを実行するたびにこれを実行しなくても済むようにしたいです。


私が試したこと/調べたこと

Cygwin DLL または Bash のコマンド補完 ( ) のソースコードを変更しないとおそらく不可能だろうと考えました。しかし、Bash の組み込み関数、および、実行可能ファイル名からサフィックスを自動的に削除する機能pcomplete.cがあることに気付きました。例:typecommand.exe

$ type -a openssl
openssl is /usr/bin/openssl

$ command -v openssl
/usr/bin/openssl

Cygwin で実行されている Bash には、拡張子なしのコマンド名のみを提供するメカニズムがあるようです.exe。ただし、コマンドを補完するときにファイル拡張子を省略するためにこれをどのように使用できるのか、または使用できるのかどうかがわかりません。

答え1

そこには.exeコマンド名を補完するときにファイル名の拡張子を含めないように Bash を構成する Cygwin の構成オプション。

completion_strip_exeオプション (Bash の Cygwin ポートに固有)を有効にすると、必要な処理が実行されます。

shopt -s completion_strip_exe

この機能は、あまり明確に文書化されていません。パス名の拡張CygwinのBashマニュアルページのセクション(アップストリームソースコードには含まれていないため、公式のマニュアルページやBashのドキュメント/usr/share/doc/Cygwin/bash.README)。 (この質問をしてから約 4 か月後に)調べているときに、これに出会いました。

7b. 'shopt -s completion_strip_exe' を使用すると、補完によって .exe サフィックスが削除されます。

このオプションは Cygwin Bash で 5 年以上前から利用可能だったようです。

----- バージョン 4.1.9-1 -- 2010-12-29 -----
Dan Colascione からの EXECIGNORE および completion_strip_exe パッチを追加します。

さらに調査してみると、この機能のパッチは投稿者: Dan Colascione2010年11月に以下の説明:

completion_strip_exe新しいシェル オプションです。有効にすると、bash は長い「.-exe」サフィックスの付いた名前ではなく、プログラムの短い名前を使用しようとします。このオプションをオンにすると、pin は「ping」に完了します。

この機能を提供してくれた Dan Colascione 氏 (私は彼に個人的に感謝の意を表すために個人的なメールを送りました) と、このような素晴らしいシェルを提供してくれた Bash のメンテナーに深く感謝します。

関連情報