Automatyczne uzupełnianie Bash dla zmiennych środowiskowych [zamknięte]


25

Funkcja autouzupełniania bash nie wydaje się działać ze zmiennymi środowiskowymi w 11.04. Obecne zachowanie pokazano poniżej

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

skutkuje \dodaniem ukośnika odwrotnego ( ) przed, $SCRIPTtzn. pojawia się monit

cd \$SCRIPT/

To samo dzieje się, jeśli cdzostanie zastąpione przez lsdowolne inne polecenie

Ponadto, jeśli w ścieżce zawartej w $ SCRIPT znajduje się plik wykonywalny i chcę go uruchomić

$SCRIPT/<tab>

Bash nie pokazuje opcji w folderze (niezależnie od tego, czy w ścieżce zawartej w zmiennych środowiskowych jest jeden plik czy wiele plików / katalogów).

Innymi słowy, autouzupełnianie nie działa ze zmiennymi środowiskowymi.



Myślę, że nie ma to nic wspólnego z wersją bash (4.1 lub 4.2). Właśnie zainstalowałem bash-4.1 ze źródeł i użyłem go zamiast 4.2.24 (wersja Ubuntu 12.04; instalowany ze źródeł, więc nie muszę „powstrzymywać” pakietu przy każdej aktualizacji sys) i zachowanie jest dokładnie taki sam. Bardzo, bardzo denerwujące ...

4
To pytanie wydaje się nie na temat, ponieważ dotyczy błędu w starej nieobsługiwanej wersji. Błąd został opisany tutaj i został naprawiony w 12.04 i później
Warren Hill

1
@WarrenHill To może być nie na temat, ponieważ dotyczy błędu (z tego powodu głosowałem za jego zamknięciem). To, że błąd występuje w nieobsługiwanej wersji, nie ma jednak znaczenia - nie zamykamy starych pytań , na które odpowiedzi są nie na temat, gdy nadejdzie data EoL, której dotyczy problem. Tylko nowe / nieodpowiadane pytania EoL są nie na temat.
Eliah Kagan

Odpowiedzi:


13

Ten błąd został wprowadzony w wersji bash 4.2. Jest tutaj długi wątek:

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

Krótko mówiąc, Chet Ramey, twórca bash, nie jest jeszcze pewien, jak to naprawić.


Czy istnieje sposób na powrót do wersji 4.1?
nilchat

1
Nadchodzi poprawka: Chet dodał shopt „direxpand”, aby przywrócić stare zachowanie. Nie ma jeszcze w Oneiric.
Nelson

8
Zaskakuje mnie, że tak mało osób narzeka na to. To duża zmiana w stosunku do sposobu, w jaki bash działał przez wiele lat.
Scott C Wilson

11

Aby odzyskać stare zachowanie, użyj polecenia

shopt -s direxpand

lub dołącz to do swojego .bashrc

Jeśli używasz tego samego .bashrc z różnymi wersjami bash, użyj

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

1
Test nie powiedzie się w przypadku bash 5.0 i 5.1.
Keith Thompson,

8

Obejście zaproponowane w http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html to:

  1. użyj <Tab>do automatycznego uzupełnienia zmiennej środowiskowej, o której mówi wiersz poleceńcd $MYVAR
  2. naciśnij <Esc>+, <Ctrl>-Eaby rozwinąć bieżący wiersz polecenia, tzn. zastąp $MYVARjego wartością ścieżkę
  3. dodaj, /a następnie korzystaj z <Tab>automatycznego uzupełniania jak zwykle

Zakłada się, że jesteś w trybie emacsa ( set -o emacs) i bash_completionrozsądnie skonfigurowałeś cd(np complete -o nospace -F _cd cd.).

Niestety nie działa to w trybie vi ( set -o vi), ponieważ wówczas rozszerzenie wiersza poleceń nie jest dostępne.


2

Po wpisaniu zmiennej powłoki

cd $SCRIPT/

wpisz Cntrl-Alt-E. To rozszerza zmienną

cd /home/user/script/

Działa to z EDITOR = vi w Fedorze 16.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.