Как установить регистронезависимое завершение в экземпляре bash без поддержки Readline
У меня есть экземпляр bash без поддержки Readline, т.е. этот bash вызывается с --noediting
вариант. Причина в том, что этот экземпляр bash используется другой программой.
Другая программа хочет знать, как этот bash завершит командную строку и для этого выдает compgen
команды в оболочке bash, например
compgen -o default I
Это прекрасно работает в моем bash без поддержки Readline. Вот пример: допустим, мы находимся в каталоге с тремя файлами:
IMG_1234.JPG
about.html
index.html
Команда compgen -o default I
печатает должным образом
IMG_1234.JPG
Однако теперь я хочу перейти к завершению без учета регистра. Обычно я выдаю в оболочке
bind 'set completion-ignore-case on'
и в экземпляре bash с поддержкой Readline все соответствует ожиданиям: compgen -o default I
печать
IMG_1234.JPG
index.html
Однако в моем экземпляре bash без поддержки Readline bind
Команда ничего не делает, и я до сих пор получаю только IMG_1234.JPG
матч.
Итак, мой вопрос: как я могу установить предложения по завершению без учета регистра (при использовании compgen
) в экземпляре bash, который вызывается без поддержки Readline?
1 ответ
Тестовая программа:
#!/bin/bash
set -e
echo "### CASE-SENSITIVE"
bash --noediting <<EOF
compgen -o default I
EOF
echo
echo "### CASE-FOLDING"
bash --noediting <<EOF
bind 'set completion-ignore-case on'
compgen -o default I
EOF
Результат:
### CASE-SENSITIVE
IMG_1234.JPG
### CASE-FOLDING
bash: line 1: bind: warning: line editing not enabled
IMG_1234.JPG
index.html
Bash версия:
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Если ваша версия bash отличается, подумайте об обновлении, поскольку я не могу воспроизвести вашу проблему с 4.3.11. (И вы, вероятно, захотите перенаправить stderr из bind
команда; Я оставил это, чтобы вы могли видеть, что это выполняется).