Bagaimana cara debug dan memperbaiki pelengkapan otomatis lambat di bash?


26

Setelah pembaruan terbaru (Ubuntu 12,04 LTS), TAB selesai pada baris perintah lambat. Setelah memasukkan perintah parsial (mis. evi [TAB]) Atau nama file parsial (mis. evince somedocu[TAB]) Shell, terkadang meskipun tidak selalu, hang selama beberapa detik.

Secara pribadi, saya lebih suka autocomplete yang kurang kuat daripada yang lambat. Apakah ada perbaikan sederhana?

Sunting: Informasi tambahan terkait dengan komentar:

  • PATH cukup standar. ~ / bin memiliki beberapa skrip bash

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
  • Jumlah file dalam direktori kerja kurang dari 100.

  • Fitur autocomplete sangat lambat setelah aktivitas disk yang tidak biasa (peningkatan sistem). Dengan demikian, mungkin, membaca ulang / usr / bin dan direktori lain yang menyebabkan lag.

4
bukankah Anda mengaktifkan manajemen kecepatan hard drive Anda dengan pembaruan, dan bahwa autocomplete menunggu hingga disk dinyalakan untuk dapat menghitung pelengkapan otomatis?
Vincent Nivoliers

2
Apakah ini tergantung pada berapa banyak file di direktori Anda saat ini?
terdon

1
Apa yang dikatakan # echo $ PATH? Jika Anda memiliki banyak (beberapa puluh ribu atau lebih) file dalam direktori di jalur Anda, itu mungkin menyebabkannya.
Stephan

Jawaban:


28

Saya tidak tahu tentang memperbaiki - ada banyak hal yang bisa menyebabkan penundaan. Tetapi saya dapat menawarkan beberapa tips untuk menyelidiki.

Seperti dugaan, mungkin ada direktori di suatu tempat di jalur pencarian ( $PATH, atau tempat di mana bash mencari data penyelesaian) yang ada di sistem file yang lambat merespons. Biasanya itu adalah filesystem jarak jauh yang lambat, tetapi bisa juga berupa hard disk yang gagal, driver FUSE yang hang, dll.

Langkah pertama untuk menyelidiki adalah menjalankan set -xuntuk mendapatkan jejak dari perintah yang dieksekusi shell untuk menghasilkan penyelesaian. Perhatikan di mana ia berhenti.

Jika itu tidak memberikan informasi yang cukup, bawa senjata besar. Catat ID proses shell ( echo $$). Di terminal lain, jalankan strace -f -s9999 -p$$(atau setara dengan strace jika dijalankan pada rasa unix lain). Strace mendaftar panggilan sistem yang dilakukan oleh proses. Lihat apakah sepertinya mengakses file yang seharusnya tidak, atau jika akses ke beberapa file lambat. Menambahkan opsi -Tke stracebaris perintah membuatnya menunjukkan waktu yang dihabiskan dalam setiap panggilan sistem.


1
Jumlah waktu saya telah menggunakan Unix dan tidak tahu tentang set -x, apa perintah yang keren. Sangat "mode hacker terlibat"
Matt Fletcher

6
Ps, gunakan set +xuntuk kembali ke mode non-debug normal
Matt Fletcher

19

Jika kotak * nix Anda disetel sebagai klien LDAP, Anda mungkin mengalami masalah ini, bahkan masuk sebagai pengguna lokal.

Info debug yang membosankan: Sedang dilakukan debugging set-x, saya menemukan penyelesaian yang tergantung pada:

> set -x
> ls foo<tab>
...                     <--- lots of output removed
...
+ _quote_readline_by_ref foo quoted
+ '[' -z foo ']'
+ [[ foo == \'* ]]      <--- froze here
+ [[ foo == ~* ]]       <--- actually causing the trouble

Konfirmasi: Saya mengkonfirmasi ini dengan ls ~*yang juga digantung. Ternyata server ldap saya lamban, tetapi ini seharusnya tidak mempengaruhi hal-hal seperti penyelesaian bash dan ls!

Solusi: Aha, ada bug yang diajukan terhadap bash-completion + ldap, itu akan diperbaiki dalam versi yang lebih baru, dan tambalan sederhana jika Anda tidak ingin menunggu. Penyelesaian tab cepat lagi, hore!

Inilah patchfile jika tautannya hilang. Ini hanya menghindari ~ pada baris 545 dan 547:

--- /usr/share/bash-completion/bash_completion.orig 2014-11-06 10:36:14.981888369 +0100
+++ /usr/share/bash-completion/bash_completion  2014-11-06 10:36:25.142070963 +0100
@@ -542,9 +542,9 @@
     elif [[ $1 == \'* ]]; then
         # Leave out first character
         printf -v $2 %s "${1:1}"
-    elif [[ $1 == ~* ]]; then
+    elif [[ $1 == \~* ]]; then
         # avoid escaping first ~
-        printf -v $2 ~%q "${1:1}"
+        printf -v $2 \~%q "${1:1}"
     else
         printf -v $2 %q "$1"
     fi

Anda harus keluar dari sesi ssh saat ini dan masuk kembali agar patch ini berlaku.


1
Saya punya masalah yang tepat ini dan tambalannya bagus
Radman

2
Masalah yang sama di sini (Debian 8.5) 2 1/3 tahun sebelumnya dan solusi bekerja seperti pesona. Debian 8.6 tidak memiliki masalah.
YoMismo

2
Saya telah menggunakan set-xa juta kali namun saya tidak pernah berharap itu juga menunjukkan masalah kinerja penyelesaian, terima kasih banyak!
MarcH

Punya masalah dengan debian 9.8!
Philippe Gachoud

0

Coba instal ulang penyelesaian-bash

sudo apt-get install --reinstall bash-completion

Bagi saya ini diperbaiki di Ubuntu 18.04.3 LTS


0

Juga beberapa orang menggunakan fitur lengkapi otomatis ekstra seperti Git bash lengkapi otomatis . Kelambatan penyelesaian Bash dapat merupakan hasil dari fitur kelengkapan otomatis tambahan yang mengalami gangguan.

Dalam kasus saya itu adalah Git bash otomatis lengkapi kunci publik git saya telah diperbarui sehingga ia melakukan upaya otentikasi gagal yang menyebabkan hang. Setelah saya menghapus selesai otomatis, itu cepat lagi. Jadi solusi saya adalah memperbaiki kunci saya dan mengaktifkannya kembali.

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.