Shell не дает никаких подсказок, если автозаполнение включено (вместо этого мигает курсор)

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

Однако это имеет побочный эффект. Несмотря на то, что автозаполнение, похоже, работает, когда я открываю новый терминал, отображается только мигающий курсор:

Я возвращаюсь к обычному приглашению user@machine:~$ только после нажатия Ctrl+C.

Нормальное поведение восстанавливается, если я прокомментировал вышеприведенные строки (но больше не автозаполнение).

Я не могу понять, в чем проблема.

- Обновление 1 -

Вот что делает код:

enter image description here

- Обновление 1 -

Вот вывод предлагаемых команд.

++++++ : /etc/bash_completion.d
++++++ readonly BASH_COMPLETION_COMPAT_DIR
++++++ _blacklist_glob='@(acroread.sh)'
++++++ shopt -s extglob progcomp
++++++ complete -d pushd
++++++ complete -u write chfn groups slay w sux runuser
++++++ complete -A stopped -P '"%' -S '"' bg
++++++ complete -j -P '"%' -S '"' fg jobs disown
++++++ complete -v readonly unset
++++++ complete -A setopt set
++++++ complete -A shopt shopt
++++++ complete -A helptopic help
++++++ complete -a unalias
++++++ complete -A binding bind
++++++ complete -c command type which
++++++ complete -b builtin
++++++ [[ linux-gnu == *@(solaris|aix)* ]]
++++++ [[ linux-gnu == *@(solaris|aix)* ]]
++++++ [[ linux-gnu == *@(solaris|aix)* ]]
++++++ _backup_glob='@(#*#|*@(~|.@(bak|orig|rej|swp|dpkg*|rpm@(orig|new|save))))'
++++++ complete -F _service service
++++++ _sysvdirs
++++++ sysvdirs=()
++++++ [[ -d /etc/rc.d/init.d ]]
++++++ [[ -d /etc/init.d ]]
++++++ sysvdirs+=(/etc/init.d)
++++++ [[ -f /etc/slackware-version ]]
++++++ for svcdir in '${sysvdirs[@]}'
++++++ for svc in '$svcdir/!($_backup_glob)'
++++++ [[ -x /etc/init.d/acpid ]]
++++++ complete -F _service /etc/init.d/acpid
++++++ for svc in '$svcdir/!($_backup_glob)'
++++++ [[ -x /etc/init.d/anacron ]]
++++++ complete -F _service /etc/init.d/anacron
++++++ for svc in '$svcdir/!($_backup_glob)'
++++++ [[ -x /etc/init.d/apparmor ]]

- Обновление 3 -

Вот запрошенный вывод:

ac@ac:~$ grep -r bash_completion /etc/bash_completion.d
/etc/bash_completion.d/bash.bashrc:#  if [ -f /usr/share/bash-completion/bash_completion ]; then
/etc/bash_completion.d/bash.bashrc:#    . /usr/share/bash-completion/bash_completion
/etc/bash_completion.d/bash.bashrc:#  elif [ -f /etc/bash_completion ]; then
/etc/bash_completion.d/bash.bashrc:#    . /etc/bash_completion
/etc/bash_completion.d/bash.bashrc.bak:#  if [ -f /usr/share/bash-completion/bash_completion ]; then
/etc/bash_completion.d/bash.bashrc.bak:#    . /usr/share/bash-completion/bash_completion
/etc/bash_completion.d/bash.bashrc.bak:#  elif [ -f /etc/bash_completion ]; then
/etc/bash_completion.d/bash.bashrc.bak:#    . /etc/bash_completion
/etc/bash_completion.d/inkscape:# put this file in /etc/bash_completion.d/ 
/etc/bash_completion.d/desktop-file-validate:# put this file in /etc/bash_completion.d/
/etc/bash_completion.d/bash_completion~:. /usr/share/bash-completion/bash_completion
/etc/bash_completion.d/git-completion.bash:#   bash_completion - programmable completion functions for bash 3.2+
/etc/bash_completion.d/libreoffice.sh:# Programmable bash_completion file for the main office applications
/etc/bash_completion.d/bash_completion:# . /usr/share/bash-completion/bash_completion

Действительно, последняя строка показывает, что вы предсказали. Но я не знаю, что делать с этим файлом: следует ли его удалить, или я ошибочно переписал его? Если да, то каков был исходный контент?

1
задан 21 August 2014 в 19:48

1 ответ

Для отладки вы можете добавить некоторые строки echo, чтобы узнать, насколько далеко он проходит через код.

Замените это примерно так:

 if ! shopt -oq posix; then
   echo Entering bash-completion load
   if [ -f /usr/share/bash-completion/bash_completion ]; then
     echo Sourcing /usr/share/bash-completion/bash_completion
     . /usr/share/bash-completion/bash_completion
     echo Sourced
   elif [ -f /etc/bash_completion ]; then
     echo Sourcing /etc/bash_completion
     . /etc/bash_completion
     echo Sourced
   fi
 fi
 echo Done

В идеальном мире вы, возможно, ll see:

Entering bash-completion load
Sourcing /usr/share/bash-completion/bash_completion
Sourced
Done

Если он попадает в скрипт bash_completion, включите его отладку и отправьте его вручную (это значит, что ваш терминал все еще работает):

set -x
. /usr/share/bash-completion/bash_completion

должен выводиться до той точки, в которой он прерывается (или выходит), и это должно дать вам еще один индикатор того, что представляет собой реальная проблема.

3
ответ дан 24 May 2018 в 04:55
  • 1
    @AlessandroCuttin Я тоже обновил мой. – Oli♦ 6 August 2014 в 21:21
  • 2
    Что вы имеете в виду с «отладкой отладки»? – Alessandro Cuttin 6 August 2014 в 23:53
  • 3
    Вопрос обновлен, я не знаю, было ли это то, о чем вы просили – Alessandro Cuttin 7 August 2014 в 13:23

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

Похожие вопросы: