`.exe` 확장자로 인해 Cygwin에서 명령 인수에 대한 탭 완성이 실패함

`.exe` 확장자로 인해 Cygwin에서 명령 인수에 대한 탭 완성이 실패함

Bash가 명령 이름을 완성할 때 파일 이름의 .exe접미사가 무시되도록(포함되지 않음) Cygwin에 구성 옵션이 있습니까?


문제에 대한 설명

명령 이름을 완성하기 위해 Cygwin 시스템의 Bash에서 탭 완성 기능을 사용하면 .exe명령 이름에 확장자가 추가됩니다. 예를 들어, 입력 opens하고 누르면 Tab명령이 완성됩니다 openssl.exe.

명령은 잘 실행되지만(MS Windows에서는 .exe명령을 실행할 때 확장이 선택 사항임) 문제는 _openssl()다음에서 제공하는 완료 기능 입니다.bash-completionopenssl패키지는 – not 에 대한 인수 완성만 제공하도록 구성됩니다 openssl.exe. 예를 들어:

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

인수를 완료하려고 할 때도 동일한 문제가 존재합니다.모두실행 가능한 명령.

나는 현재 Readline 편집을 위해 구성된 Emacs 모드와 함께 Bash를 사용하므로 명령에 대한 인수 입력을 시작하기 전에 를 누르고 Esc두 번 Backspace눌러 접미사를 제거 할 수 있습니다. .exe이상적으로는 명령을 실행할 때마다 이 작업을 수행하지 않아도 되는 것이 좋습니다.


내가 시도한/연구한 것

나는 Cygwin DLL이나 Bash의 명령 완성( ) 소스 코드를 수정하지 않으면 아마도 불가능할 것이라고 생각했습니다 pcomplete.c. type그러나 Bash 내장 기능이 실행 파일 이름에서 접미사를 command자동으로 제거하는 것을 확인했습니다. 예:.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

이 기능은 명확하게 문서화되어 있지 않습니다.경로명 확장Bash에 대한 Cygwin 매뉴얼 페이지 섹션(업스트림 소스 코드에 포함되어 있지 않으므로 공식 매뉴얼 페이지에 문서화되어 있지 않습니다.Bash에 대한 문서). 나는 정독하는 동안 그것을 발견했습니다 /usr/share/doc/Cygwin/bash.README(이 질문을 한 지 약 4개월 후).

7b. 'shopt -s 완성_strip_exe'를 사용하면 완성 스트립 .exe 접미사가 만들어집니다.

이 옵션은 Cygwin Bash에서 5년 넘게 사용할 수 있었던 것으로 보입니다.

----- 버전 4.1.9-1 -- 2010-12-29 -----
Dan Colascione의 EXECIGNORE 및 achievement_strip_exe 패치를 추가하세요.

추가 연구에 따르면 이 기능에 대한 패치는 다음과 같습니다.Dan Colascione이 제출한2010년 11월에다음 설명:

completion_strip_exe새로운 쉘 옵션입니다. 활성화되면 bash는 긴 ".-exe" 접미사 대신 프로그램의 짧은 이름을 사용하려고 시도합니다. 이 기능을 켜면 핀이 "ping"으로 완료됩니다.

이 기능을 제공한 Dan Colascione(그에게 개인적으로 감사하기 위해 개인 이메일을 보냈습니다)과 훌륭한 쉘을 제공한 Bash 관리자에게 많은 감사를 드립니다.

관련 정보