Comment faire en sorte que bash arrête d'échapper à $ pendant la fin de la tabulation?


38

J'ai ceci sur la ligne de commande:

ln -sf $PWD/wine-

et puis je frappe Tabpour compléter le nom de fichier. Dans les versions antérieures d'Ubuntu, cela complétait parfaitement le wine-nom de fichier (et l'effet secondaire $PWDserait étendu à ce moment-là). Mais maintenant, il se tourne vers

ln -sf \$PWD/wine-

ce qui n'est pas du tout ce que je voulais dire et ne complète rien car le fichier ne commence pas littéralement par $.

Comment puis-je obtenir l'achèvement du comportement moins brisé?

set me dit que ce sont mes paramètres actuels:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

2
Si vous êtes concerné par ce bogue, envisagez de voter sous l'URL suivante (connexion requise): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton

Réponses:


36

J'ai trouvé que les versions de bash> = 4.2.29 ont un nouveau direxpandparamètre shopt. ( man docs/bash.1Vérifiez si vous consultez une nouvelle bash ou consultez bash.1 à partir de la ligne 8951 )

Si on utilise Quantal Quetzal 12.10 ou s’empare d’une autre bash (ou vérifie et construit), alors:

shopt -s direxpand

Me donne le comportement que je veux, dont j'ai besoin et que j'aime.

Solution: En attendant, Ctrl+ Alt+ au Elieu de Tabfait ce que je veux aussi. Mais c'est maladroit.

BTW, Il existe plusieurs threads appelés "question d'expansion de variable bash tab?" dans gnu.bash.bug . En les lisant, j'ai trouvé l'info ici.


2
une version de bash avec direxpand fait son chemin dans Precise (12.04): Voir bugs.launchpad.net/bugs/778627
keturn

8
Ce serait encore mieux si mon chemin énorme n'était pas étendu et que je pourrais continuer à utiliser une variable non échappée avec achèvement.
jozxyqk

@jozxyqk Avez-vous déjà trouvé un moyen d'obtenir cette fonctionnalité sans extension de chemin?
Ungeheuer le

@ Ungeheuer J'utilise actuellement bash 4.4.19sur Ubuntu 18.04 et cela fonctionne. Je ne sais pas quand cela a changé.
jozxyqk le

La réponse de user3080602 ci-dessous a fonctionné pour moi - shopt -u progcomprésout le problème sans étendre la variable à sa valeur
Gilthans Il y a

2

rechercher _filedir()dans le script bash_completion de niveau supérieur et modifier la ligne

compopt -o filenames 2>/dev/null

à

compopt -o filenames -o noquote 2>/dev/null

Dans 12.04 GNU bash, version 4.2.25, cette suggestion donne l’erreur suivante:compopt: noquote: invalid option name
arielf

1

Pour ceux (comme moi) avec 12.04 peuvent utiliser ~ + au lieu de $ PWD ...

par exemple :

cd /bin
echo ~+/ls
/bin/ls

1

Même avec la mise à jour bash, je trouvais que je m'échappais $toujours.

  • Enlever le bash-completion (1:2.1-3.fc20)paquet
  • ou tout simplement ne pas chercher /etc/bashrcde source ~/.bashrcsemblait le régler.

Je pense que je vais maintenant manquer certaines fonctionnalités auxquelles je suis normalement habitué mais que je n’en ai pas encore remarquées.


Alternative (au moins pour Fedora 26), ajoutez export BASH_COMPLETION_VERSINFO=0avant d’acheter /etc/bashrc. Cela fait croire au script problématique que son origine a déjà été obtenue.


1
shopt -u progcomp

Cela a résolu le problème pour moi, mais aussi de nombreuses options de complétion "intelligentes" qui me gênent en ne complétant pas les fichiers que je connais sont là car la bêtise pense que je ne les veux pas comme arguments d'un particulier. commander. ARRRGH


Cela l'a fait pour moi! Cela n'échappe pas à la variable, ni ne l'élargit. Merci!
Gilthans Il y a


0

Désactiver l'option shell 'complete_fullquote' fait le travail:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: nom de l’option shell invalide
Anton Gorev
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.