Penyelesaian bash membuat bash mulai perlahan

15

Memulai bash di sistem ubuntu saya membutuhkan waktu sekitar 2 detik. Jika saya menghapus memuat / etc / bash_completition di .bashrc dimulai tanpa penundaan. Tentu saja saya tidak ingin menyerah penyelesaian dan saya tidak berpikir memuat file itu alasan yang sah untuk penundaan 2 detik.

Ada ide bagaimana saya bisa mengetahui apa masalahnya atau bagaimana saya bisa mempercepatnya.

pengguna75250
sumber
apakah ini / bin / bash? - coba / bin / dash mungkin sedikit lebih cepat.
Sirex
3
Ini sebabnya saya menghapus bash-completion
Vi.

Jawaban:

8

Pembaruan pada 2013: Sebagian besar penyelesaian-bash ditulis ulang untuk melengkapi secara otomatis hanya bila diperlukan. Naskah intinya jauh lebih tinggi sekarang.


Script penyelesaian kadang-kadang bisa sangat besar dalam standar skrip shell. Pada satu server saya memiliki akses, hampir 1700 baris (57 KB) dan itu hanya skrip inti . Di /etc/bash_completion.dada ~ 200 skrip tambahan untuk berbagai perintah lainnya ( openssl, mutt, mount...) sebesar 25.537 baris atau 1,2 MB. Setiap skrip, ketika bersumber, memeriksa apakah suatu perintah benar-benar tersedia sebelum mendefinisikan penangan penyelesaian; ~ 330 kali dalam kasus ini, masing-masing melibatkan memeriksa $PATHfile yang dapat dieksekusi dengan nama yang diberikan. (Meskipun saya berharap /usr/binakan di-cache dalam memori ...)

Memang, bahkan itu hanya membutuhkan setengah detik untuk memuat, bukan dua detik penuh. Tapi itu mungkin setidaknya bagian dari masalah. Jalankan du -hs /etc/bash_completion*atau wc -l /etc/bash_completion{,.d/*} | grep totaljika Anda ingin memeriksa.


Anda dapat mencoba sumber skrip secara manual, dalam mode "jejak":

set -x
. /etc/bash_completion

Anda akan melihat setiap baris saat dijalankan. Jika ada perintah tertentu yang membutuhkan waktu lama, Anda harus memperhatikannya.

( set +xmenonaktifkan mode jejak.)

pengguna1686
sumber
Fitur creep bahkan dalam mode teks sederhana? Ini lebih mungkin daripada yang Anda pikirkan.
Vi.
@ Vi: Setelah melihat zsh mengkompilasi skrip
startupnya
1
Terima kasih. Itu sangat mudah. Sayangnya, semua perintah tidak terlalu berbeda. Jadi sepertinya itu memang jumlah besar apa yang menyebabkan masalah.
user75250
12

Saya menemukan sedikit solusi yang sepertinya cukup berhasil.

Larutan

Di bagian bawah ~/.bashrctambahkan:

sumber trap / etc / bash_completion; menjebak USR1 'USR1
{tidur 0,1; builtin kill -USR1 $$; } & ditolak

Penjelasan

trap 'source /etc/bash_completion ; trap USR1' USR1

Siapkan pawang yang akan dijalankan ketika shell menerima sinyal SIGUSR1; pawang akan memuat penyelesaian dan karenanya akan menonaktifkan dirinya sendiri.

{ sleep 0.1 ; builtin kill -USR1 $$ ; } & disown

Tunggu sebentar, lalu kirim sinyal ke shell saat ini. disowndiperlukan untuk menekan bashumpan balik kontrol proses. sleepdiperlukan untuk bekerja secara tidak sinkron.

Masalah

Untuk beberapa alasan, perintah pertama yang dikeluarkan untuk shell ini tidak akan dicatat dalam sejarah.

cYrus
sumber
1
Ini tampaknya tidak memberikan dorongan startup - time bash -lc truelaporan ~ 0,12 dengan atau tanpa ini, meskipun time source /etc/bash_completionmelaporkan angka yang lebih tinggi seperti 0,26. Apakah ini sudah diperbaiki secara efektif ?
l0b0
Saya tidak tahu apakah time bash -lc trueberfungsi dengan baik di sini sejak trueselesai sebelumnya ~0.1ssehingga tidak ada sumber apa pun. Ngomong-ngomong time source /etc/bash_completionmelaporkan ~ 0.17 di sini dan itu tentang waktu saya harus menunggu untuk PS1muncul.
cYrus
2
Berbakat! Dalam penjelasannya, perintah trap meleset USR1di akhir.
Fish Monitor
Dengan SIGUSR, penangan sinyal tidak dipanggil sampai setelah saya menekan enter pada prompt shell. Ada jeda pada saat itu saat berjalan. Saya beralih ke SIGQUIT dan sepertinya berfungsi dengan baik.
Jon Nalley
5

Anda harus menggunakan versi terbaru (2.0) dari bash_completion. Jika Anda menggunakan Debian, itu dalam wheezy, tetapi tidak memiliki dependensi pada paket wheezy lainnya, sehingga Anda dapat menginstalnya pada pemerasan tanpa masalah.

Versi terbaru memuat penyelesaian secara dinamis dengan cepat, sehingga membagi waktu muat cepat untuk saya setidaknya 10x.

xryl669
sumber
1

Anda dapat menggunakan tempat penampung saat penyelesaian memuat; itu seharusnya cukup untuk menipu mata Anda. Ini jelas bekerja hanya jika waktu yang dibutuhkan source /etc/bash_completionkurang dari waktu yang Anda butuhkan untuk mengetik dan mengeluarkan perintah shell pertama, jika tidak maka akan ditunda juga.

Idenya adalah untuk menggemakan yang palsu PS1, sumber kelengkapan dan akhirnya memperbaiki terminal.

Misalkan Anda PS1yaitu \u@\h:\w\$, mereka Anda mungkin menulis sesuatu seperti:

echo -ne "$USER@$HOSTNAME:${PWD/$HOME/\~}\$ "
source /etc/bash_completion
echo -ne '\e[2J\e[H'

Dimana:

  • 2J menghapus terminal;
  • H pindahkan kursor ke sudut kanan atas.

Catatan: Anda mungkin ingin memeriksa apakah pengguna root dan menggunakan #alih-alih $untuk konsistensi:

echo -ne "...$([ $UID = 0 ] && echo '#' || echo '$') "

Catatan: Menghapus \e[2Jmenghindari kedipan tetapi akan meninggalkan karakter sampah jika placeholder lebih panjang dari prompt yang sebenarnya.

cYrus
sumber