4

Есть ли в Cygwin параметр конфигурации, чтобы при завершении Bash имени команды суффикс имени файла .exe игнорировался (не включался)?


Объяснение проблемы

Когда для завершения имени команды используется завершение табуляции в Bash в системе Cygwin, к имени команды добавляется расширение .exe , например, ввод текста opens и нажатие клавиши Tab завершает команду для openssl.exe .

Команда работает нормально (в MS Windows расширение .exe является необязательным при выполнении команды), но проблема в том, что функция завершения _openssl() предоставляемая пакетом bash-completion complete, настроена только на предоставление завершений аргументов для openssl - не openssl.exe . Например:

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

Та же проблема существует при попытке завершить аргументы для всех исполняемых команд.

В настоящее время я использую Bash с режимом Emacs, настроенным для редактирования Readline, поэтому я могу нажать клавишу Esc, а затем два нажатия клавиши Backspace, чтобы удалить суффикс .exe прежде чем я начну вводить аргументы команды. В идеале я бы хотел избежать необходимости делать это каждый раз, когда запускаю команду.


Что я пробовал / исследовал

Я подумал, что это, вероятно, невозможно без изменения исходного кода DLL-библиотеки Cygwin или завершения команды Bash (pcomplete.c). Тем не менее, я заметил, что встроенные команды Bash, type и command автоматически удаляют суффикс .exe из имен исполняемых файлов, например:

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

$ command -v openssl
/usr/bin/openssl

Похоже, что Bash, работающий в Cygwin, имеет некоторый механизм для предоставления простого имени команды (без расширения .exe ). Тем не менее, я был в недоумении относительно того, как - или если - это может быть использовано, чтобы опустить расширение файла при выполнении команд.

1 ответ1

5

Оказывается, что существует вариант конфигурации в Cygwin , которая конфигурирует Bash не включать расширение .exe имя файла, когда он завершает имя команды.

Включение опции completion_strip_exe (специфично для порта Cygwin Bash) делает то, что я хочу:

shopt -s completion_strip_exe

Эта функция явно не документирована: она упоминается в разделе «Расширение пути» справочной страницы Cygwin для Bash (она не включена в исходный исходный код, поэтому не документирована на официальной странице руководства или в документации по Bash). Я сталкивался с этим, просматривая /usr/share/doc/Cygwin/bash.README (примерно через 4 месяца после того, как задали этот вопрос):

7b. использование 'shopt -s complete_strip_exe' делает суффиксы полосы завершения .exe.

Похоже, что эта опция была доступна в Cygwin Bash более 5 лет:

----- версия 4.1.9-1 - 2010-12-29 -----
Добавьте EXECIGNORE и patch_strip_exe патчи от Dan Colascione.

Дальнейшие исследования показывают, что патч для этой функции был представлен Дэном Колассьоне еще в ноябре 2010 года со следующим описанием:

completion_strip_exe - это новая опция оболочки. При включении bash пытается использовать короткое имя программы вместо более длинного, с суффиксом «. Exe». С этим на контакте завершается "пинг".

Большое спасибо Дэну Колассионе (я только что отправил ему личное письмо, чтобы лично поблагодарить его) за эту функцию и сопровождающим Bash за предоставление такой замечательной оболочки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .