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.
ubuntu
performance
bashrc
tab-completion
pengguna75250
sumber
sumber
Jawaban:
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.d
ada ~ 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$PATH
file yang dapat dieksekusi dengan nama yang diberikan. (Meskipun saya berharap/usr/bin
akan 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*
atauwc -l /etc/bash_completion{,.d/*} | grep total
jika Anda ingin memeriksa.Anda dapat mencoba sumber skrip secara manual, dalam mode "jejak":
Anda akan melihat setiap baris saat dijalankan. Jika ada perintah tertentu yang membutuhkan waktu lama, Anda harus memperhatikannya.
(
set +x
menonaktifkan mode jejak.)sumber
Saya menemukan sedikit solusi yang sepertinya cukup berhasil.
Larutan
Di bagian bawah
~/.bashrc
tambahkan: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.
disown
diperlukan untuk menekanbash
umpan balik kontrol proses.sleep
diperlukan untuk bekerja secara tidak sinkron.Masalah
Untuk beberapa alasan, perintah pertama yang dikeluarkan untuk shell ini tidak akan dicatat dalam sejarah.
sumber
time bash -lc true
laporan ~ 0,12 dengan atau tanpa ini, meskipuntime source /etc/bash_completion
melaporkan angka yang lebih tinggi seperti 0,26. Apakah ini sudah diperbaiki secara efektif ?time bash -lc true
berfungsi dengan baik di sini sejaktrue
selesai sebelumnya~0.1s
sehingga tidak ada sumber apa pun. Ngomong-ngomongtime source /etc/bash_completion
melaporkan ~ 0.17 di sini dan itu tentang waktu saya harus menunggu untukPS1
muncul.USR1
di akhir.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.
sumber
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_completion
kurang 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
PS1
yaitu\u@\h:\w\$
, mereka Anda mungkin menulis sesuatu seperti: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:Catatan: Menghapus
\e[2J
menghindari kedipan tetapi akan meninggalkan karakter sampah jika placeholder lebih panjang dari prompt yang sebenarnya.sumber