Bash automático completo para variáveis ​​de ambiente [fechado]

25

O recurso de preenchimento automático do bash parece não funcionar com variáveis ​​de ambiente no 11.04. O comportamento atual é indicado abaixo

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

resulta em uma barra invertida ( \) sendo adicionada antes, $SCRIPTou seja, o prompt se torna

cd \$SCRIPT/

A mesma coisa acontece se cdfor substituído por lsou qualquer outro comando

Além disso, se houver um arquivo executável no caminho contido em $ SCRIPT e eu quero executá-lo

$SCRIPT/<tab>

O Bash não mostra as opções dentro da pasta (independentemente de haver um único arquivo ou vários arquivos / diretórios no caminho contido nas variáveis ​​de ambiente).

Em outras palavras, o preenchimento automático não funciona com variáveis ​​de ambiente.

nilchat
fonte
2
Aqui está o erro na barra de ativação .
Idbrii
Eu acho que não tem a ver com a versão bash (4.1 ou 4.2). Acabei de instalar o bash-4.1 a partir dos fontes e o usei em vez do 4.2.24 (versão do Ubuntu 12.04; instalado a partir dos fontes, para que eu não precise 'reter' o pacote a cada atualização do sistema) e o comportamento é exatamente o mesmo. Muito, muito chato ... #
4
Esta pergunta parece estar fora do tópico, pois trata-se de um bug em uma versão antiga não suportada. O bug é descrito aqui e foi corrigido em 12.04 e posterior
Warren Hill
1
@WarrenHill Isso pode estar fora de tópico porque se trata de um bug (e eu votei em fechá-lo por esse motivo). O fato de o bug estar em uma versão não suportada é irrelevante - não fechamos perguntas antigas que tenham respostas fora do tópico quando a data de EoL da versão afetada chegar. Somente perguntas de EoL novas / não respondidas estão fora de tópico.
Eliah Kagan

Respostas:

13

Este bug foi introduzido no bash 4.2. Há uma longa discussão sobre isso aqui:

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

Em resumo, Chet Ramey, desenvolvedor do bash, ainda não sabe ao certo como proceder para corrigi-lo.

Geirha
fonte
Existe uma maneira de reverter para o bash 4.1?
Nilchat 12/05
1
Uma correção está a caminho: Chet adicionou uma loja "direxpand" para restaurar o comportamento antigo. Ainda não está em Oneiric.
Nelson
8
É surpreendente para mim que poucas pessoas se queixaram disso. É uma grande mudança em relação ao modo como o bash funciona há vários anos.
Scott C Wilson
11

Para recuperar o comportamento antigo, use o comando

shopt -s direxpand

ou inclua-o no seu .bashrc

Se você usar o mesmo .bashrc com versões diferentes do bash, use

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi
user164395
fonte
1
Esse teste falhará no bash 5.0 e 5.1.
Keith Thompson
8

A solução alternativa sugerida em http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html é:

  1. use <Tab>para auto-completar sua variável de ambiente st você linha de comando dizcd $MYVAR
  2. pressione <Esc>+ <Ctrl>-Epara expandir a linha de comando atual, ou seja, substitua $MYVARpelo seu valor, o caminho
  3. adicione um /e aproveite o <Tab>preenchimento automático, como de costume

Isso pressupõe que você esteja no modo emacs ( set -o emacs) e tenha bash_completionconfigurado de forma sensata para cd(por exemplo complete -o nospace -F _cd cd).

Infelizmente, isso não funciona no modo vi ( set -o vi) porque a expansão da linha de comando não está disponível.

kynan
fonte
2

Depois de digitar a variável shell

cd $SCRIPT/

digite Cntrl-Alt-E. Isso expande a variável

cd /home/user/script/

Isso funciona com EDITOR = vi no Fedora 16.

Scott C Wilson
fonte