¿Cómo hacer que bash deje de escapar $ durante la finalización de la pestaña?


38

Tengo esto en la línea de comando:

ln -sf $PWD/wine-

y luego presioné Tabpara completar el nombre del archivo. En versiones anteriores de Ubuntu, esto funcionó bien para completar el wine-nombre de archivo (y como efecto secundario $PWDse expandiría en ese momento). Pero ahora lo convierte en

ln -sf \$PWD/wine-

que no es lo que quise decir en absoluto y no completa nada ya que el archivo no comienza literalmente $.

¿Cómo vuelvo a completar el comportamiento menos roto?

set me dice que estos son mis ajustes actuales:

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 está afectado por este error, considere votar bajo la siguiente URL (requiere inicio de sesión): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton

Respuestas:


36

Descubrí que las versiones bash> = 4.2.29 tienen una nueva direxpandconfiguración de shopt. (Vea man docs/bash.1si echa un vistazo a un nuevo bash, o vea bash.1 de la línea 8951 )

Si uno usa Quantal Quetzal 12.10 o de lo contrario se apodera (o desprotege y construye) una nueva fiesta, entonces:

shopt -s direxpand

Me da el comportamiento que quiero, necesito y amo.

Solución alternativa: Mientras tanto, Ctrl+ Alt+ en Elugar de Tabhacer lo que quiero también. Pero es incómodo.

Por cierto, hay varios hilos llamados "bash tab variable expansion question?" en gnu.bash.bug . Al leerlos, encontré la información aquí.


2
una versión de bash con direxpand está llegando a Precise (12.04): vea bugs.launchpad.net/bugs/778627
keturn el

8
Sería aún mejor si no tuviera mi gran camino expandido y pudiera continuar usando una variable sin escape con finalización.
jozxyqk

@jozxyqk ¿Alguna vez encontró una manera de obtener esa función de expansión sin ruta?
Ungeheuer

@Ungeheuer Actualmente estoy usando bash 4.4.19en Ubuntu 18.04 y simplemente funciona. No estoy seguro cuando esto cambió.
jozxyqk

La respuesta de user3080602 a continuación funcionó para mí: shopt -u progcompresuelve el problema sin expandir la variable a su valor
Gilthans

2

buscar _filedir()en el script de nivel superior bash_completion y cambiar la línea

compopt -o filenames 2>/dev/null

a

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

En 12.04 GNU bash, versión 4.2.25, esta sugerencia da el error:compopt: noquote: invalid option name
arielf

1

Para aquellos (como yo) con 12.04 pueden usar ~ + en lugar de $ PWD ...

por ejemplo :

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

1

Incluso con el bash actualizado, descubrí que $aún se escapa.

  • Retirar el bash-completion (1:2.1-3.fc20)paquete
  • o simplemente no el abastecimiento /etc/bashrcde ~/.bashrcparecía solucionarlo.

Sospecho que ahora me faltarán algunas características a las que normalmente estoy acostumbrado pero que aún no he notado.


Alternativa (al menos para Fedora 26), agregue export BASH_COMPLETION_VERSINFO=0antes del abastecimiento /etc/bashrc. Esto hace que la secuencia de comandos problemática piense que ya ha sido obtenida.


1
shopt -u progcomp

Esto lo arregló para mí, también eliminó muchas opciones de finalización "inteligentes" que he encontrado que se interponen en el camino al no completar los archivos que sé que están allí porque la estúpida cree que no los quiero como argumentos para un particular mando. ARRRGH


¡Esto lo hizo por mí! No escapa a la variable, ni la expande. ¡Gracias!
Gilthans


0

Deshabilitar la opción de shell 'complete_fullquote' hace el trabajo:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: nombre de opción de shell no válido
Anton Gorev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.