Я использую Debian Jessie 8.6. Я заметил, что apt-get
при нажатии Tab для пакетов и команд он получает ожидаемое автодополнение bash, но при попытке использовать его с apt
ним он не работает. Я помню, как использовал xubuntu 16.04, где это работало, поэтому мне кажется странным, что здесь это не работает. Есть ли способ включить его apt
и для команды? Если да, то как?
решение1
Debian не поставляется с установленным и включенным пакетом «bash-completion».
Если вы переходите на Debian, скажем, после Ubuntu, где он предустановлен и включен по умолчанию, это может стать источником некоторой путаницы.
Чтобы включить/исправить это, выполните (как root):
apt-get install bash-completion
Тогда у вас есть два варианта. Вы можете:
1. Включите его для каждого пользователя отдельно или
2. Включите его глобально.
1. Если вы хотите включить его только для своего пользователя, отредактируйте ~/.bashrc
— добавьте следующее:
if [ -f /etc/bash_completion ]; then
. /etc/bash_completion
fi
Чтобы попробовать это, не выходя из системы и не входя в нее снова, выполните:
. ~/.bashrc
Или откройте новую оболочку. Затем попробуйте использовать автодополнение с помощью apt. Эта точка и пробел в начале ( .
) — то же самое, что и использование source
ключевого слова в bash, но более переносимо.
Если вы хотите, чтобы это работало при su
входе в учетную запись root, сделайте то же самое в домашнем каталоге root (обычно /root
).
2.Чтобы включить его глобально, выполните изменения из (1) в файле /etc/bash.bashrc
вместо этого.
Для тех, кто задается вопросом, почему это работает, .
перед этим /etc/bash_completion
стоитнетссылаются на текущий каталог, так как вокруг него есть пробелы. Вместо этого он заставляет содержимое указанного файла оцениваться в текущей запущенной оболочке, а не выполняться в новой подоболочке.Здесь это стандартизировано.
В Bash это .
можно заменить командой source
, но это не стандартизировано POSIX и менее переносимо, поэтому я стараюсь отговаривать людей от ее использования. В этом случае, поскольку это программа для расширения bash, а не то, что должно работать в оболочке bourne или ksh
, вы можете смело заменять source
для удобства чтения.
Кстати, такое поведение (не открытие подоболочки) похоже на то, как обычно работают скрипты DOS/Windows .BAT, изменяя состояние оболочки, в которой они запущены. Вот почему, если вы cd
перейдете по другому пути в скрипте оболочки, вы не окажетесь по этому пути при завершении работы скрипта, как это было бы в .BAT.
решение2
В Debian 9 Stretch просто отредактируйте /etc/bash.bashrc и раскомментируйте:
# enable bash completion in interactive shells
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
решение3
Как я это решил
У меня возникли проблемы с автодополнением при попытке автодополнения wget
, apt-get install wg[TAB][TAB]
и мне удалось решить их, удалив --no-generate
параметр из следующих файлов:
/usr/share/bash-completion/completions/apt-cache
/usr/share/bash-completion/completions/apt-get
Стоит отметить, что эти файлы доступны только после установки bash-completion
.
Параметр --no-generate
, на который я ссылаюсь, можно увидеть в строке ниже, но я удалил ВСЕ --no-generate
, а не только из этой строки:
https://github.com/scop/bash-completion/blob/master/completions/apt-get#L28
Как я дошел до этого?
Я дошел до этого места после запуска set -v
предыдущей команды apt-get install wg[TAB][TAB]
, которая показала, что выполненная команда была:
apt-cache --no-generate pkgnames wg
и на выходе была ошибка:
E: Could not open file - open (2: No such file or directory)
При выполнении apt-cache pkgnames wg
без него --no-generate
я правильно получил список для автодополнения:
root@484f5c8f56ba:/# apt-cache pkgnames wg
wgalician-minimos
wget2
wgaelic
wget
wgerman-medical
wget2-dev
Надеюсь это поможет.
решение4
Скопируйте этот файл конфигурации из Ubuntu: /usr/share/bash-completion/completions/apt в тот же каталог в Jessie. Вы также можете получить файл здесь:http://pastebin.com/PRBMt3an