Come ottenere bash per interrompere l'escape di $ durante il completamento della scheda?


38

Ho questo sulla riga di comando:

ln -sf $PWD/wine-

e poi ho premuto Tabper completare il nome del file. Nelle versioni precedenti di Ubuntu, questo funzionava perfettamente per completare il wine-nome del file (e come effetto collaterale $PWDsarebbe stato ampliato in quel momento). Ma ora lo trasforma in

ln -sf \$PWD/wine-

che non è quello che intendevo affatto e non completa nulla in quanto il file non inizia letteralmente $.

Come posso ottenere il completamento del comportamento meno rotto?

set mi dice che queste sono le mie impostazioni attuali:

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

2
Se sei affetto da questo errore, ti preghiamo di prendere in considerazione la votazione nel seguente url (richiede il login): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton,

Risposte:


36

Ho scoperto che le versioni bash> = 4.2.29 hanno una nuova direxpandimpostazione shopt. (Vedi man docs/bash.1se dai un'occhiata a un nuovo bash o vedi bash.1 dalla linea 8951 )

Se si utilizza Quantal Quetzal 12.10 o si ottiene in altro modo (o si verifica e si crea) un nuovo bash, quindi:

shopt -s direxpand

Mi dà il comportamento che desidero, di cui ho bisogno e che amo.

Soluzione alternativa: nel frattempo Ctrl+ Alt+ Einvece di Tabfare anche quello che voglio. Ma è imbarazzante.

A proposito, ci sono diversi thread chiamati "domanda di espansione della variabile tabh bash?" in gnu.bash.bug . Leggendoli, ho trovato le informazioni qui.


2
una versione di bash con direxpand si sta facendo strada in Precise (12.04): vedi bugs.launchpad.net/bugs/778627
keturn

8
Sarebbe ancora meglio se non avessi ampliato il mio enorme percorso e potessi continuare a utilizzare una variabile senza escape con il completamento.
jozxyqk,

@jozxyqk Hai mai trovato un modo per ottenere quella funzione di espansione senza percorso?
Ungeheuer

@Ungeheuer Attualmente sto usando bash 4.4.19su Ubuntu 18.04 e funziona. Non sono sicuro quando questo è cambiato.
jozxyqk,

La risposta di user3080602 qui sotto ha funzionato per me - shopt -u progcomprisolve il problema senza espandere la variabile al suo valore
Gilthans

2

cerca _filedir()nello script bash_completion di livello superiore e modifica la riga

compopt -o filenames 2>/dev/null

a

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

In 12.04 GNU bash, versione 4.2.25 questo suggerimento dà l'errore:compopt: noquote: invalid option name
ari

1

Per quelli (come me) con 12.04 può usare ~ + invece di $ PWD ...

per esempio :

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

1

Anche con la bash aggiornata, stavo scoprendo $che mi sfugge ancora.

  • Rimozione del bash-completion (1:2.1-3.fc20)pacchetto
  • o semplicemente non provenire /etc/bashrcda ~/.bashrcsembrava ripararlo.

Ho il sospetto che ora mi mancheranno alcune funzionalità a cui normalmente sono abituato ma che non ho ancora notato.


Alternativa (almeno per Fedora 26), aggiungere export BASH_COMPLETION_VERSINFO=0prima di approvvigionamento /etc/bashrc. Questo fa pensare che lo script problematico sia già stato acquistato.


1
shopt -u progcomp

Ciò ha risolto il problema per me, ha anche rimosso molte opzioni di completamento "intelligenti" che ho trovato ostacolano non completando i file che so che ci sono perché la cosa stupida pensa che non li voglio come argomenti per un particolare comando. Arrrgh


Questo l'ha fatto per me! Non sfugge alla variabile, né la espande. Grazie!
Gilthans


0

Disabilitare l'opzione shell 'complete_fullquote' fa il lavoro:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: nome opzione shell non valido
Anton Gorev
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.