J'ai essayé d'activer l'autocomplétion de Shell sans commenter les lignes suivantes dans mon .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
Cependant, cela a un effet secondaire. Même si la saisie semi-automatique semble fonctionner, lorsque j'ouvre un nouveau terminal, seul un curseur clignotant est présenté:
Je reviens à l'habituel user@machine:~$
Demander uniquement après avoir appuyé sur Ctrl+C
.
Le comportement normal est restauré si je commente les lignes ci-dessus (mais plus de saisie semi-automatique).
Je ne peux pas comprendre quel est le problème.
- Mise à jour 1 -
Voici ce que fait le code:
- Mise à jour 2 -
Voici la sortie des commandes suggérées. Quelque chose continue à boucler et le terminal est inondé par la sortie.
++++++ : /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 ]]
- Mise à jour 3 -
Voici la sortie demandée:
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
En effet, la dernière ligne montre ce que vous avez prédit. Mais je ne sais pas quoi faire de ce fichier: dois-je le supprimer ou le remplacer par erreur? Si oui, quel était le contenu original?
Le fait que la sortie que vous obtenez avec set -x
contient tant de signes positifs (++++++
) signifie que / usr/share/bash-complétion/bash_completion est en cours de ré-approvisionnement récursif.
En d'autres termes, / usr/share/bash-complétement/bash_completion "s'appelle" lui-même, résultant en une sorte de boucle infinie, comme vous l'avez noté.
Si j'étais vous, je vérifierais / etc/bash_completion.d à la recherche de références à / usr/share/bash-complétion/bash_completion. Plus précisément, voici ce que je ferais:
ls -l /etc/bash_completion.d
(il ne doit pas y avoir de lien symbolique vers / usr/share/bash-complétion/bash_completion);grep -r bash_completion /etc/bash_completion.d
(aucun des fichiers de / etc/bash_completion.d ne doit être source / usr/share/bash-complét/bash_completion).Alternativement, vous pouvez exécuter ces deux commandes dans votre shell (sans complétion bash activée, bien sûr):
set -x
. /usr/share/bash-completion/bash_completion |& grep -E "^\++ (\.|source)"
Cela imprimera toutes les "importations" et nous aidera à identifier le mauvais morceau de code qui cause le problème.
De la sortie de grep -r bash_completion /etc/bash_completion.d
vous pouvez voir de nombreuses correspondances. La plupart d'entre eux sont des commentaires (car ils commencent par #
), mais il y a une ligne intéressante:
/etc/bash_completion.d/bash_completion~:. /usr/share/bash-completion/bash_completion
/ etc/bash_completion.d/bash_completion ~ est le coupable. Il s'agit du fichier à l'origine de la ressource de recours.
/ usr/share/bash-complétion/bash_completion en fait, automatiquement source chaque fichier dans le répertoire / etc/bash_completion.d. Mais ce répertoire, dans votre cas, contient à nouveau le fichier bash_completion ~, qui est à l'origine / usr/share/bash-complétement/bash_completion. Il en résulte le type de boucle que vous rencontrez.
Alors allez-y et supprimez-le!
Sudo rm /etc/bash_completion.d/bash_completion~
(Ou peut-être le lire si vous pensez qu'il contient quelque chose d'utile.)
Je ne peux pas vous dire pourquoi ce fichier était dans ce répertoire. Ce que je peux vous dire, c'est que le suffixe ~
signifie qu'il s'agit d'un fichier de sauvegarde. De nombreux éditeurs de texte (y compris Gedit) créent des copies de sauvegarde lors de l'enregistrement. Il a probablement été laissé par erreur pendant que vous apportiez des modifications.
Pour des raisons de débogage, vous pouvez ajouter quelques lignes echo
pour voir jusqu'où il passe dans le code. Je suppose que ça casse à un moment donné, mais ça ne le fait pas très fort.
Remplacez-le par quelque chose comme ceci:
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
Dans un monde idéal, vous verrez:
Entering bash-completion load
Sourcing /usr/share/bash-completion/bash_completion
Sourced
Done
S'il est pris dans le script bash_completion, activez le débogage et sourcez-le manuellement (cela suppose que votre terminal fonctionne toujours):
set -x
. /usr/share/bash-completion/bash_completion
Cela devrait sortir jusqu'au point où il se casse (ou se termine) et cela devrait vous donner un autre indicateur de ce qu'est le problème réel.