Bash otomatis selesai untuk variabel lingkungan [ditutup]

25

Fitur bash autocomplete tampaknya tidak berfungsi dengan variabel lingkungan di 11.04. Perilaku saat ini ditunjukkan di bawah ini

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

hasil dalam backslash ( \) ditambahkan sebelum $SCRIPTyaitu prompt menjadi

cd \$SCRIPT/

Hal yang sama terjadi jika cddiganti dengan lsatau perintah lainnya

Juga, jika ada file yang dapat dieksekusi di jalur yang terkandung dalam $ SCRIPT dan saya ingin menjalankannya

$SCRIPT/<tab>

Bash tidak menunjukkan opsi di dalam folder (terlepas dari apakah ada satu file atau beberapa file / direktori di dalam path yang terdapat dalam variabel lingkungan).

Dengan kata lain, autocomplete tidak berfungsi dengan variabel lingkungan.

nilchat
sumber
2
Inilah bug di launchpad .
idbrii
Saya pikir itu tidak ada hubungannya dengan versi bash (4.1 atau 4.2). Saya baru saja menginstal bash-4.1 dari sumber dan menggunakannya sebagai pengganti 4.2.24 (versi Ubuntu 12.04; diinstal dari sumber sehingga saya tidak perlu 'menahan' paket di setiap upgrade sys) dan perilaku persis sama. Sangat, sangat menjengkelkan ...
4
Pertanyaan ini tampaknya di luar topik karena ini tentang bug dalam rilis lama yang tidak didukung. Bug dijelaskan di sini dan telah diperbaiki pada 12,04 dan kemudian
Warren Hill
1
@ WarrenHill Ini mungkin di luar topik karena ini tentang bug (dan saya telah memilih untuk menutupnya karena alasan itu). Bahwa bug dalam rilis yang tidak didukung tidak relevan - kami tidak menutup pertanyaan lama yang memiliki jawaban di luar topik ketika tanggal EoL rilis yang terpengaruh datang. Hanya pertanyaan EOL baru / tidak dijawab yang di luar topik.
Eliah Kagan

Jawaban:

13

Bug ini diperkenalkan di bash 4.2. Ada utas panjang tentang hal itu di sini:

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

Singkatnya, Chet Ramey, pengembang bash, belum yakin bagaimana cara memperbaikinya.

geirha
sumber
Apakah ada cara untuk kembali ke bash 4.1?
nilchat
1
Perbaikan sedang dalam jalan: Chet menambahkan shopt "direxpand" untuk mengembalikan perilaku lama. Itu belum ada di Oneiric.
Nelson
8
Mengejutkan bagi saya bahwa begitu sedikit orang mengeluh tentang hal ini. Ini adalah perubahan besar dari cara bash bekerja selama beberapa tahun.
Scott C Wilson
11

Untuk mendapatkan kembali behaivior lama, gunakan perintah

shopt -s direxpand

atau memasukkannya ke dalam .bashrc

Jika Anda menggunakan .bashrc yang sama dengan versi bash yang berbeda, gunakan

if ((BASH_VERSINFO[0] >= 4)) && ((BASH_VERSINFO[1] >= 2))
    then shopt -s direxpand
fi
pengguna164395
sumber
1
Tes itu akan gagal untuk bash 5.0 dan 5.1.
Keith Thompson
8

Solusi yang disarankan di http://lists.gnu.org/archive/html/bug-bash/2011-02/msg00274.html adalah:

  1. gunakan <Tab>untuk melengkapi secara otomatis variabel lingkungan Anda seperti yang dikatakan baris perintahcd $MYVAR
  2. tekan <Esc>+ <Ctrl>-Euntuk memperluas baris perintah saat ini yaitu gantikan $MYVARdengan nilainya, path
  3. tambahkan a /lalu nikmati <Tab>pelengkapan otomatis seperti biasa

Ini mengasumsikan Anda berada dalam mode emacs ( set -o emacs) dan telah bash_completionmengatur dengan masuk akal untuk cd(misalnya complete -o nospace -F _cd cd).

Sayangnya ini tidak berfungsi dalam mode vi ( set -o vi) karena perluasan baris perintah tidak tersedia saat itu.

kynan
sumber
2

Setelah mengetikkan variabel shell

cd $SCRIPT/

ketik Cntrl-Alt-E. Ini memperluas variabel

cd /home/user/script/

Ini bekerja dengan EDITOR = vi di Fedora 16.

Scott C Wilson
sumber