Completamento automatico Bash per variabili d'ambiente [chiuso]


25

La funzione di completamento automatico di bash non sembra funzionare con le variabili di ambiente in 11.04. Il comportamento attuale è indicato di seguito

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

comporta l' \aggiunta di una barra rovesciata ( ) prima che $SCRIPTil prompt diventi

cd \$SCRIPT/

La stessa cosa accade se cdviene sostituito con lso qualsiasi altro comando

Inoltre, se esiste un file eseguibile nel percorso contenuto in $ SCRIPT e voglio eseguirlo

$SCRIPT/<tab>

Bash non mostra le opzioni all'interno della cartella (indipendentemente dal fatto che ci sia un singolo file o più file / directory all'interno del percorso contenuto nelle variabili di ambiente).

In altre parole, il completamento automatico non funziona con le variabili di ambiente.



Penso che non abbia a che fare con la versione bash (4.1 o 4.2). Ho appena installato bash-4.1 da fonti e l'ho usato al posto del 4.2.24 (versione di Ubuntu 12.04; installato da fonti quindi non devo "trattenere" il pacchetto ad ogni aggiornamento di sistema) e il comportamento è esattamente lo stesso. Molto, molto fastidioso ...

4
Questa domanda sembra essere fuori tema perché riguarda un bug in una vecchia versione non supportata. Il bug è descritto qui ed è stato corretto in 12.04 e versioni successive
Warren Hill l'

1
@WarrenHill Questo potrebbe essere fuori tema perché si tratta di un bug (e per questo motivo ho votato per chiuderlo). Il fatto che il bug si trovi in ​​una versione non supportata è comunque irrilevante: non chiudiamo vecchie domande che hanno risposte fuori tema quando arriva la data EoL della versione interessata. Solo le domande EoL nuove / senza risposta sono fuori tema.
Eliah Kagan,

Risposte:


13

Questo errore è stato introdotto in bash 4.2. C'è una lunga discussione al riguardo qui:

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

In breve, Chet Ramey, lo sviluppatore di bash, non è ancora sicuro di come risolvere il problema.


C'è un modo per tornare a bash 4.1?
nilchat,

1
Una soluzione è in arrivo: Chet ha aggiunto un negozio "direxpand" per ripristinare il vecchio comportamento. Non è ancora in Oneiric.
Nelson,

8
Mi sorprende che così poche persone si siano lamentate di questo. È un grande cambiamento rispetto al modo in cui bash ha lavorato per diversi anni.
Scott C Wilson,

11

Per recuperare il vecchio comportamentale, usa il comando

shopt -s direxpand

o includilo nel tuo .bashrc

Se usi lo stesso .bashrc con diverse versioni di bash, usa

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi

1
Quel test fallirà per bash 5.0 e 5.1.
Keith Thompson,

8

La soluzione alternativa suggerita in http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html è:

  1. utilizzare <Tab>per completare automaticamente la variabile di ambiente st dice la riga di comandocd $MYVAR
  2. premi <Esc>+ <Ctrl>-Eper espandere la riga di comando corrente, ovvero sostituire $MYVARcon il suo valore, il percorso
  3. aggiungi un /e poi goditi il <Tab>completamento automatico come al solito

Ciò presuppone che tu sia in modalità emacs ( set -o emacs) e che tu abbia bash_completionconfigurato in modo ragionevole cd(ad es complete -o nospace -F _cd cd.).

Sfortunatamente questo non funziona in modalità vi ( set -o vi) perché allora l'espansione della riga di comando non è disponibile.


2

Dopo aver digitato la variabile shell

cd $SCRIPT/

digitare Cntrl-Alt-E. Questo espande la variabile

cd /home/user/script/

Questo funziona con EDITOR = vi in ​​Fedora 16.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.