Bagaimana cara mendapatkan bash untuk berhenti melarikan diri $ selama penyelesaian tab?


38

Saya memilikinya di baris perintah:

ln -sf $PWD/wine-

dan kemudian saya menekan Tabuntuk melengkapi nama file. Dalam versi Ubuntu yang lebih lama, ini berfungsi dengan baik untuk melengkapi wine-nama file (dan sebagai efek samping $PWDakan diperluas pada saat itu). Tapi sekarang berubah menjadi

ln -sf \$PWD/wine-

yang bukan maksud saya sama sekali dan tidak menyelesaikan apa-apa karena file tidak benar-benar dimulai $.

Bagaimana saya mendapatkan penyelesaian kembali ke perilaku yang kurang rusak?

set beritahu saya ini adalah pengaturan saya saat ini:

BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor

2
Jika Anda terpengaruh oleh bug ini, harap pertimbangkan memberikan suara di bawah url berikut (memerlukan login): bugs.launchpad.net/ubuntu/+source/bash/+bug/778627/…
cripton

Jawaban:


36

Saya telah menemukan bahwa versi bash> = 4.2.29 memiliki direxpandpengaturan shopt baru . (Lihat man docs/bash.1apakah Anda memeriksa bash baru, atau lihat bash.1 dari baris 8951 )

Jika seseorang menggunakan Quantal Quetzal 12.10 atau mendapatkan (atau memeriksa dan membuat) bash baru, maka:

shopt -s direxpand

Memberi saya perilaku yang saya inginkan, butuhkan dan cintai.

Solusi: Sementara itu, Ctrl+ Alt+ Ealih-alih Tabmelakukan apa yang saya inginkan juga. Tapi canggung.

BTW, Ada beberapa utas yang disebut "pertanyaan ekspansi variabel bash tab?" di gnu.bash.bug . Dari membacanya, saya menemukan info di sini.


2
versi bash dengan direxpand sedang menuju Precise (12.04): Lihat bugs.launchpad.net/bugs/778627
keturn

7
Akan lebih baik jika saya tidak memiliki jalur besar saya diperluas dan dapat terus menggunakan variabel un-escaped dengan selesai.
jozxyqk

@ jozxyqk Apakah Anda pernah menemukan cara untuk mendapatkan fitur no-path-expansion?
Ungeheuer

@Ungeheuer Saat ini saya menggunakan bash 4.4.19di Ubuntu 18.04 dan hanya berfungsi. Tidak yakin kapan ini berubah.
jozxyqk

2

cari _filedir()di skrip bash_completion tingkat atas dan ubah baris

compopt -o filenames 2>/dev/null

untuk

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

Dalam 12,04 GNU bash, versi 4.2.25 saran ini memberikan kesalahan:compopt: noquote: invalid option name
arielf

1

Bagi mereka (seperti saya) dengan 12,04 dapat menggunakan ~ + bukannya $ PWD ...

sebagai contoh :

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

1

Bahkan dengan bash yang diperbarui, saya menemukan $masih lolos.

  • Menghapus bash-completion (1:2.1-3.fc20)paket
  • atau hanya tidak mengambil /etc/bashrcdari ~/.bashrctampaknya memperbaikinya.

Saya kira sekarang saya akan kehilangan beberapa fitur yang biasanya saya gunakan tetapi belum melihat adanya.


Alternatif (setidaknya untuk Fedora 26), tambahkan export BASH_COMPLETION_VERSINFO=0sebelum sumber /etc/bashrc. Ini membuat skrip yang bermasalah berpikir itu sudah bersumber.



0

Menonaktifkan opsi shell 'complete_fullquote' berfungsi:

shopt -u complete_fullquote

$ shopt -u complete_fullquote -bash: shopt: complete_fullquote: nama opsi shell tidak valid
Anton Gorev

0
shopt -u progcomp

Ini memperbaikinya bagi saya, itu juga menghapus banyak pilihan penyelesaian "cerdas" yang saya temukan menghalangi dengan tidak menyelesaikan file yang saya tahu ada di sana karena hal bodoh berpikir saya tidak ingin mereka sebagai argumen untuk argumen tertentu perintah. ARRRGH

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.