Bash auto complete para variables de entorno [cerrado]

25

La función de autocompletar bash no parece funcionar con variables de entorno en 11.04. El comportamiento actual se indica a continuación.

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

resulta en una barra invertida ( \) que se agrega antes, $SCRIPTes decir, la solicitud se convierte en

cd \$SCRIPT/

Lo mismo sucede si cdse sustituye con lscualquier otro comando

Además, si hay un archivo ejecutable en la ruta contenida en $ SCRIPT y quiero ejecutarlo

$SCRIPT/<tab>

Bash no muestra las opciones dentro de la carpeta (independientemente de si hay un solo archivo o múltiples archivos / directorios dentro de la ruta contenida en las variables de entorno).

En otras palabras, el autocompletado no funciona con variables de entorno.

nilchat
fuente
2
Aquí está el error en la plataforma de lanzamiento .
idbrii
Creo que no tiene que ver con la versión bash (4.1 o 4.2). Acabo de instalar bash-4.1 desde las fuentes y lo utilicé en lugar de 4.2.24 (versión de Ubuntu 12.04; instalado desde las fuentes para no tener que 'retener' el paquete en cada actualización del sistema) y el comportamiento Es exactamente lo mismo. Muy, muy molesto ...
44
Esta pregunta parece estar fuera de tema porque se trata de un error en una versión antigua no compatible. El error se describe aquí y se ha solucionado en 12.04 y posteriores
Warren Hill
1
@WarrenHill Esto puede estar fuera de tema porque se trata de un error (y he votado para cerrarlo por esa razón). Sin embargo, el hecho de que el error se encuentre en una versión no admitida es irrelevante: no cerramos viejas preguntas que tienen respuestas fuera de tema cuando aparece la fecha de EoL de la versión afectada. Solo las preguntas de EoL nuevas / sin respuesta están fuera de tema.
Eliah Kagan

Respuestas:

13

Este error se introdujo en bash 4.2. Hay un largo hilo al respecto aquí:

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

En resumen, Chet Ramey, el desarrollador de bash, no está seguro de cómo solucionarlo todavía.

geirha
fuente
¿Hay alguna manera de volver a bash 4.1?
nilchat
1
Una solución está en camino: Chet agregó un "direxpand" shopt para restaurar el comportamiento anterior. Todavía no está en Oneiric.
Nelson
8
Me sorprende que tan pocas personas se hayan quejado de esto. Es un gran cambio en la forma en que bash ha funcionado durante varios años.
Scott C Wilson,
11

Para recuperar el comportamiento anterior, use el comando

shopt -s direxpand

o inclúyelo en tu .bashrc

Si usa el mismo .bashrc con diferentes versiones de bash, use

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi
usuario164395
fuente
1
Esa prueba fallará para bash 5.0 y 5.1.
Keith Thompson
8

La solución sugerida en http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html es:

  1. use <Tab>para completar automáticamente su variable de entorno st su línea de comando dicecd $MYVAR
  2. presione <Esc>+ <Ctrl>-Epara expandir la línea de comando actual, es decir, sustituir $MYVARpor su valor, la ruta
  3. agregue /ay luego disfrute <Tab>de la finalización automática como siempre

Esto supone que está en modo emacs ( set -o emacs) y que se ha bash_completionconfigurado de manera sensata para cd(por ejemplo complete -o nospace -F _cd cd).

Desafortunadamente, esto no funciona en modo vi ( set -o vi) porque la expansión de línea de comandos no está disponible en ese momento.

kynan
fuente
2

Después de escribir la variable de shell

cd $SCRIPT/

escriba Cntrl-Alt-E. Esto expande la variable

cd /home/user/script/

Esto funciona con EDITOR = vi en Fedora 16.

Scott C Wilson
fuente