Bash auto complete pour les variables d'environnement [fermé]

25

La fonction de saisie semi-automatique de bash ne semble pas fonctionner avec les variables d'environnement dans 11.04. Le comportement actuel est indiqué ci-dessous

export SCRIPT=/home/user/script
cd $SCRIPT/<tab>

entraîne l' \ajout d' une barre oblique inverse ( ) avant que $SCRIPTl'invite ne devienne

cd \$SCRIPT/

La même chose se produit si cdest remplacé par lsou toute autre commande

De plus, s'il y a un fichier exécutable dans le chemin d'accès contenu dans $ SCRIPT et que je veux l'exécuter

$SCRIPT/<tab>

Bash n'affiche pas les options à l'intérieur du dossier (qu'il y ait un seul fichier ou plusieurs fichiers / répertoires à l'intérieur du chemin contenu dans les variables d'environnement).

En d'autres termes, la saisie semi-automatique ne fonctionne pas avec les variables d'environnement.

nilchat
la source
2
Voici le bug du tableau de bord .
idbrii
Je pense que cela n'a pas à voir avec la version bash (4.1 ou 4.2). Je viens d'installer bash-4.1 à partir des sources et je l'ai utilisé à la place du 4.2.24 (version d'Ubuntu 12.04; installé à partir des sources, donc je n'ai pas à `` retenir '' le paquet à chaque mise à niveau sys) et le comportement est exactement le même. Très, très ennuyeux ...
4
Cette question semble être hors sujet car il s'agit d'un bogue dans une ancienne version non prise en charge. Le bug est décrit ici et a été corrigé dans 12.04 et versions ultérieures
Warren Hill
1
@WarrenHill Cela peut être hors sujet car il s'agit d'un bug (et j'ai voté pour le fermer pour cette raison). Le fait que le bogue se trouve dans une version non prise en charge n'est pas pertinent - nous ne fermons pas les anciennes questions qui ont des réponses hors sujet lorsque la date d'EoL de la version affectée arrive. Seules les questions EoL nouvelles / sans réponse sont hors sujet.
Eliah Kagan

Réponses:

13

Ce bogue a été introduit dans bash 4.2. Il y a un long fil à ce sujet ici:

http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html

En bref, Chet Ramey, le développeur de bash, ne sait pas encore comment y remédier.

geirha
la source
Existe-t-il un moyen de revenir à bash 4.1?
nilchat
1
Un correctif est en cours: Chet a ajouté un shopt "direxpand" pour restaurer l'ancien comportement. Ce n'est pas encore dans Oneiric.
Nelson
8
C'est surprenant pour moi que si peu de gens se plaignent de cela. C'est un grand changement par rapport à la façon dont bash fonctionne depuis un certain nombre d'années.
Scott C Wilson du
11

Pour récupérer l'ancien comportement, utilisez la commande

shopt -s direxpand

ou l'inclure dans votre .bashrc

Si vous utilisez le même .bashrc avec différentes versions de bash, utilisez

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi
user164395
la source
1
Ce test échouera pour bash 5.0 et 5.1.
Keith Thompson
8

La solution de contournement suggérée dans http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html est:

  1. utiliser <Tab>pour compléter automatiquement votre variable d'environnement st vous dit en ligne de commandecd $MYVAR
  2. appuyez sur <Esc>+ <Ctrl>-Epour développer la ligne de commande actuelle, c'est-à-dire remplacer $MYVARpar sa valeur, le chemin
  3. ajoutez un /, puis profitez de <Tab>la saisie semi-automatique comme d'habitude

Cela suppose que vous êtes en mode emacs ( set -o emacs) et que vous l'avez bash_completionconfiguré de manière raisonnable cd(par exemple complete -o nospace -F _cd cd).

Malheureusement, cela ne fonctionne pas en mode vi ( set -o vi) car l'expansion de la ligne de commande n'est pas disponible alors.

kynan
la source
2

Après avoir tapé la variable shell

cd $SCRIPT/

tapez Cntrl-Alt-E. Cela étend la variable

cd /home/user/script/

Cela fonctionne avec EDITOR = vi dans Fedora 16.

Scott C Wilson
la source