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.



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.


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

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.


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.

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.