Tab-завершение шаблонов оболочки
На моих серверах Debian я привык нажимать на Tab, чтобы "просмотреть" расширение шаблонов оболочки:
$ cp *some*<Tab>
something somewhat have-some-cake
$ cp *some*_
Когда шаблон расширяется до одной записи, Tab заменяет шаблон реальной записью; в противном случае отображается список подходящих записей. Это интуитивно понятно и полезно, потому что оно согласуется с обычным завершением табуляции "префикс".
Но мои серверы и рабочие столы Ubuntu ведут себя по-разному: даже если он расширится до более чем одной записи, Tab заменяет шаблон первой записью.
Я проверил обычных подозреваемых (/etc/bash.bashrc, /etc/inputrc и локальные версии) и не смог найти никакой разницы.
Кто-нибудь знает, какие настройки контролируют это поведение?
2 ответа
Вопреки другому ответу, эта конкретная проблема, вероятно, является прямым результатом использования bash-complete. В пакете bash-complete есть несколько ошибок (как отмечалось в этом ответе U&L о похожей проблеме, например).
Если я закомментирую этот раздел в моем .bashrc
:
# enable programmable completion features (you don't need to enable
# this, if it's already enabled in /etc/bash.bashrc and /etc/profile
# sources /etc/bash.bashrc).
if ! shopt -oq posix; then
if [ -f /usr/share/bash-completion/bash_completion ]; then
. /usr/share/bash-completion/bash_completion
elif [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
fi
и начать новый экземпляр Bash, то я получаю:
$ echo *o*<tab><tab>
foo food foo.sh
$ echo *o*
И тогда, если я источник /usr/share/bash-completion/bash_completion
Сценарий, как это было в .bashrc
:
$ . /usr/share/bash-completion/bash_completion
$ echo foo
*o*
был немедленно заполнен до foo
без показа других матчей.
Я использую 16.04, кстати. Я не знаю, было ли это исправлено в новых версиях.
$ dpkg-query --show --showformat='${Package} ${version}\n' bash bash-completion
bash 4.3-14ubuntu1.2
bash-completion 1:2.1-4.2ubuntu1.1
Более разумное завершение вкладки в Bash требует bash-completion
пакет.
sudo apt install bash-completion
Завершение Bash фактически написано и поддерживается Debian напрямую.
(Смотрите также его пакет Debian и страницы пакета Ubuntu.)
После установки он либо загружается автоматически (например, через /etc/bash.bashrc
) или вам нужно будет поручить Bash загрузить его в ваш ~/.bashrc
с такой строфой:
if [[ -z "$BASH_COMPLETION" ]] && [[ -r /etc/bash_completion ]]; then
. /etc/bash_completion
fi
До того, как Red Hat и другие включили этот пакет, я использовал ручное копирование /etc/bash_completion*
между системами. Это будет работать довольно хорошо, но я не предлагаю это; это также исключает возможность для вашего менеджера пакетов обновить существующие дополнения и установить новые (которые теперь идут в /usr/share/bash-completion/completions/
хотя они изначально жили с вашими пользовательскими дополнениями в /etc/bash_completion.d/
).