web-dev-qa-db-ja.com

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

Cygwinには、Bashがコマンドの名前を入力したときに、ファイル名の.exeサフィックスが無視される(含まれない)ように構成オプションがありますか?


問題の説明

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

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

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

all実行可能コマンドの引数を完成させようとすると同じ問題が発生します。

私は現在、Readline編集用に構成されたEmacsモードでBashを使用しているので、 Esc 続いて2つ Backspace コマンドの引数の入力を開始する前に、を押して.exeサフィックスを削除します。理想的には、コマンドを実行するたびにこれを実行する必要はありません。


私が試した/調べたもの

Cygwin DLLまたはBashのコマンド補完(pcomplete.c)のソースコードを変更しないと、おそらくそれは不可能だと思いました。しかし、Bashの組み込みファイルであるtypecommandは、実行可能ファイルの名前から.exeサフィックスを自動的に削除します。

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

$ command -v openssl
/usr/bin/openssl

Cygwinで実行されているBashには、(.exe拡張子なしで)裸のコマンド名を提供するための何らかのメカニズムがあるようです。ただし、コマンドを完了するときにこれを使用してファイル拡張子を省略できるかどうか、または使用できるかどうかについて、私は途方に暮れています。

4

Cygwinには、ファイル名の名前が完成したときにファイル名の.exe拡張子を含まないようにBashを構成する構成オプションがisあることがわかりました。コマンド。

completion_strip_exeオプション(BashのCygwinポートに固有)を有効にすると、私が望むことを実行できます。

shopt -s completion_strip_exe

この機能はあまり明確に文書化されていません:BashのCygwinマニュアルページのPathname Expansionセクションで大まかな言及があります(アップストリームソースコードには含まれていないため、含まれていません)公式のマニュアルページまたは Bashのドキュメント )に記載されています。 /usr/share/doc/Cygwin/bash.READMEを熟読しているときに遭遇しました(この質問をしてから約4か月後):

7b。 'shopt -s complete_strip_exe'を使用すると、補完ストリップの.exeサフィックスが作成されます。

このオプションは、CygwinBashで5年以上使用されているようです。

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

さらなる調査によると、この機能のパッチは Dan Colascioneによって提出された 2010年11月に 以下の説明 でした:

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

この機能と、このような優れたシェルを提供してくれたBashのメンテナに対して、Dan Colascione(私は彼に個人的に感謝するために個人的な電子メールを送信しました)に感謝します。

7