Как установить регистронезависимое завершение в экземпляре 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 команда; Я оставил это, чтобы вы могли видеть, что это выполняется).

Другие вопросы по тегам