Como fazer com que o bash pare de escapar de $ durante a conclusão da guia?


38

Eu tenho isso na linha de comando:

ln -sf $PWD/wine-

e então pressionei Tabpara concluir o nome do arquivo. Nas versões anteriores do Ubuntu, isso funcionava muito bem para concluir o wine-nome do arquivo (e como efeito colateral $PWDseria expandido naquele momento). Mas agora o transforma em

ln -sf \$PWD/wine-

que não é exatamente o que eu quis dizer e não completa nada, pois o arquivo não começa literalmente $.

Como recupero a conclusão do comportamento menos prejudicial?

set diz-me estas são minhas configurações atuais:

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 você é afetado por esse bug, considere votar no seguinte URL (requer login): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton

Respostas:


36

Descobri que as versões do bash> = 4.2.29 têm uma nova direxpandconfiguração de shopt. (Veja man docs/bash.1se você fez check-out de um novo bash ou se vê bash.1 da linha 8951 )

Se alguém usar o Quantal Quetzal 12.10 ou se apossar (ou efetuar o check-out e criar) uma nova festança, então:

shopt -s direxpand

Dá-me o comportamento que quero, preciso e amo.

Solução alternativa: enquanto isso, Ctrl+ Alt+ em Evez de Tabfaz o que eu quero também. Mas é estranho.

BTW, existem vários threads chamados "questão de expansão variável da guia bash?" no gnu.bash.bug . Ao lê-los, encontrei as informações aqui.


2
uma versão do bash com direxpand está chegando ao Precise (12.04): Veja bugs.launchpad.net/bugs/778627
keturn

7
Seria ainda melhor se eu não tivesse meu caminho enorme expandido e pudesse continuar usando uma variável não escapada com a conclusão.
precisa saber é o seguinte

@jozxyqk Você já encontrou uma maneira de obter esse recurso sem expansão de caminho?
Ungeheuer 08/04

@ Ungeheuer Atualmente, estou usando o bash 4.4.19no Ubuntu 18.04 e ele simplesmente funciona. Não tenho certeza quando isso mudou.
jozxyqk 26/04

2

procure _filedir()no script bash_completion de nível superior e altere a linha

compopt -o filenames 2>/dev/null

para

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

Em 12,04 GNU bash, versão 4.2.25 esta sugestão dá o erro:compopt: noquote: invalid option name
arielf

1

Para aqueles (como eu) com 12.04 pode usar ~ + em vez de $ PWD ...

por exemplo :

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

1

Mesmo com o bash atualizado, eu estava descobrindo que $ainda é escapado.

  • Removendo o bash-completion (1:2.1-3.fc20)pacote
  • ou simplesmente não abastecimento /etc/bashrcde ~/.bashrcparecia para corrigi-lo.

Eu suspeito que agora estou perdendo alguns recursos que normalmente estou acostumado, mas ainda não percebi.


Alternativa (pelo menos para o Fedora 26), adicione export BASH_COMPLETION_VERSINFO=0antes da fonte /etc/bashrc. Isso faz com que o script problemático pense que já foi originado.



0

Desativar a opção de shell 'complete_fullquote' faz o trabalho:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: nome da opção de shell inválido
Anton Gorev

0
shopt -u progcomp

Isso o corrigiu para mim, e também removeu muitas opções de conclusão "inteligentes" que eu encontrei no caminho por não concluir os arquivos que eu sei que existem porque a coisa estúpida pensa que eu não os quero como argumentos para um determinado comando. ARRRGH

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.