
Есть ли в Cygwin параметр конфигурации, позволяющий при завершении Bash имени команды .exe
игнорировать суффикс имени файла (не включать его)?
Объяснение проблемы
При использовании автодополнения клавишей Tab в Bash в системе Cygwin для завершения имени команды .exe
к имени команды добавляется расширение, например, ввод opens
и нажатие Tabзавершает команду до openssl.exe
.
Команда выполняется нормально (в MS Windows .exe
расширение необязательно при запуске команды), но проблема в том, что _openssl()
функция завершения, предоставляемаяbash-completion
пакет настроен только на предоставление дополнений аргументов для 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
суффикс, прежде чем начать вводить аргументы для команды. В идеале я хотел бы избежать необходимости делать это каждый раз при запуске команды.
Что я пробовал/исследовал
Я подумал, что это, вероятно, невозможно без изменения исходного кода Cygwin DLL или автодополнения команд 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
Оказывается, что естьявляетсяпараметр конфигурации в Cygwin, который настраивает Bash так, чтобы он не включал расширение имени файла .exe
при завершении имени команды.
Включение этой completion_strip_exe
опции (специфичной для порта Bash для Cygwin) делает то, что мне нужно:
shopt -s completion_strip_exe
Эта функция не очень явно документирована: она упоминается вскользь вРасширение имени путираздел страницы руководства Cygwin для Bash (он не включен в исходный код основной ветки разработки, поэтому не документирован на официальной странице руководства илидокументация для Bash). Я наткнулся на это, просматривая /usr/share/doc/Cygwin/bash.README
(примерно через 4 месяца после того, как задал этот вопрос):
7б. использование 'shopt -s completion_strip_exe' создает суффиксы .exe для завершения полосы.
Похоже, эта опция доступна в Cygwin Bash уже более 5 лет:
----- версия 4.1.9-1 -- 2010-12-29 -----
Добавлены патчи EXECIGNORE и completion_strip_exe от Дэна Колационе.
Дальнейшие исследования показывают, что исправление для этой функции былопредставлено Дэном Колашионееще в ноябре 2010 года сследующее описание:
completion_strip_exe
это новая опция оболочки. При включении bash пытается использовать короткое имя программы вместо более длинного с суффиксом ".-exe". При включении pin завершается в "ping".
Огромное спасибо Дэну Колационе (я только что отправил ему личное письмо, чтобы поблагодарить его лично) за эту функцию и разработчикам Bash за предоставление такой замечательной оболочки.