Tại sao bash hoàn thành được tải quá chậm trên OS X?


16

Tôi không hiểu tại sao hoàn thành bash được tải quá chậm trên MacBook Pro của tôi.

Tôi đã làm như sau trong ~/.bash_profile:

echo "Loading BashCompletion..."
if [ -f /opt/local/etc/bash_completion ]; then
    . /opt/local/etc/bash_completion
fi
echo "BashCompletion loaded."

thời gian thực hiện cho bash_completion thường là> 2 giây.

Tôi thấy điều đó thực sự khó chịu khi tôi đang làm việc trên thiết bị đầu cuối đòi hỏi tôi phải liên tục mở các tab mới.

Có cách nào tôi có thể lưu trữ cái này hay cái gì đó không?

(Lưu ý tôi đang sử dụng iTerm2 và điều này cũng chậm không kém trên thiết bị đầu cuối gốc trong Mac).


Điều đó không nên xảy ra. Tôi có đúng không khi bạn sử dụng hoàn thành bash của MacPort?
slhck

Tập tin bạn tải trông như thế nào?
Daniel Beck

@slhck: Có, tôi thực sự đang sử dụng hoàn thành bash của macport
biến mất vào

@Daniel: Mọi thứ đều ổn trừ điều này. Tôi định hình hầu hết mọi dòng.
biến mất

5
Tôi trải nghiệm sự chậm chạp tương tự và tôi đang sử dụng Homebrew.
Brice

Câu trả lời:


10

Phiên bản ngắn: Xóa một dòng duy nhất khỏi /usr/local/etc/bash_completiongiảm thời gian mở tab mới từ mười giây xuống một phần tư giây. Đọc để biết chi tiết.

Tôi đang sử dụng bash-xong từ homebrew và gặp phải vấn đề tương tự. Mất hơn mười giây để tải các tập lệnh hoàn thành bash mỗi lần tôi mở một thiết bị đầu cuối.

Hầu hết thời gian đó, dường như được đưa lên bởi một dòng duy nhất trong have()hàm: một lệnh gọi typeđể xác định xem chương trình dòng lệnh có được cài đặt hay không.

Với have()chức năng mặc định và tất cả các tập lệnh hoàn thành bash được cung cấp, sẽ mất 10,561 để tải tập lệnh (được báo cáo bằng cách thêm tiền tố timevào . /opt/local/etc/bash_completiondòng trong .bash_profiletệp của tôi .

Sau khi nhận xét PATH=$PATH:/sbin:/usr/sbin:/usr/local/sbin type $1 &>/dev/null &&dòng /usr/local/etc/bash_completionkịch bản của tôi (rời khỏi have=yesdòng, việc mở một thiết bị đầu cuối mới chỉ mất 0,258 giây. Lần này có thể được giảm thêm bằng cách xóa các tập lệnh hoàn thành không cần thiết (symlink) khỏi /usr/local/etc/bash_completion.dthư mục.

Tôi không biết tại sao cuộc gọi đến lại typemất nhiều thời gian như vậy. Tôi đang điều tra tiếp theo.

Một nhược điểm tiềm năng của phương pháp này là nó sẽ khiến các hàm hoàn thành bash được tải vào bộ nhớ mặc dù bạn không sử dụng chúng. Các have()kiểm tra chức năng để xem nếu một lệnh hoặc ứng dụng được cài đặt. Nếu không, tập lệnh hoàn thành thường quyết định không tải nó vì nó sẽ không được sử dụng.

Hiện tại, tôi hài lòng với sự đánh đổi nhưng tôi sẽ tiếp tục khám phá typevấn đề khi tôi có thời gian. Tôi sẽ cập nhật câu trả lời của mình nếu tôi tìm được giải pháp tốt hơn.


Đối với tôi, nhận xét dòng này giúp giảm thời gian 50ms, từ 230ms xuống 180ms. Tất nhiên tôi không bao giờ có nó quá tệ ở nơi đầu tiên. 👍
Edward Anderson

Điều này chỉ cạo đi khoảng 60ms, vì vậy tôi đã không giữ được cách giải quyết. Tôi không có thời gian chờ đợi mười giây, nhưng khoảng 2 giây, điều đó thật khó chịu.
danemacmillan

7

Đối với bất cứ ai đến kết luận rằng thời gian khởi động cho vỏ mới trên hệ điều hành MacOS là quá chậm đối với họ, đây là những giải pháp .

Tôi chỉ phát hiện ra rằng trên thực tế có hai gói có thể được cài đặt thông qua brew. Tôi đã cài đặt bash-completiongói trong nhiều năm và không bao giờ bận tâm đặt câu hỏi, mặc dù trong thời gian đó tôi đã đi từ Bash 3, đến 4, đến bây giờ 5. Tuy nhiên, thỉnh thoảng tôi vẫn xem xét lại vấn đề , thường vấp phải cuộc thảo luận rất StackOverflow này.

Có một gói khác , bash-completion@2!

Có gì khác biệt? bash-completiondành cho phiên bản Bash 3.2. bash-completion@2dành cho Bash phiên bản 4.1+ và 5.

Khi gỡ bỏ bash-completiongói cũ và cài đặt bash-completion@2, thời gian khởi động shell của tôi đã giảm từ 605ms xuống còn 244ms. Đó là một cải tiến tốc độ rất lớn.

Tôi nghi ngờ nhiều người trong chúng ta đang mắc phải lỗi tương tự, vì các brew infosố liệu thống kê cho thấy cái trước có hàng tấn cài đặt, trong khi cái sau có quá ít:

nhập mô tả hình ảnh ở đây

Cần lưu ý rằng câu trả lời được chọn hiện tại đề cập đến việc bình luận một số dòng, chỉ cung cấp một sự cải thiện nhỏ cho thời gian khởi động (nếu sử dụng bash-completiongói cũ , có thể là nhiều), nhưng không ảnh hưởng gì đến bash-completion@2gói mới : gói mới này là nhanh không có vấn đề gì. Điều đó có nghĩa là không cần hack.

TL; DR:

brew uninstall bash-completion && brew install bash-completion@2

Nhớ cập nhật đường dẫn nguồn đến tệp hoàn thành trong tệp .bashrchoặc .bash_profiletệp của bạn .

Nguồn:


Là một chủ đề hơi liên quan, tôi sử dụng rclonetiện ích rất nhiều, vì vậy nó đã được cài đặt. Nó cũng có tập tin hoàn thành lớn nhất mà tôi từng thấy . Loại bỏ nó làm giảm thời gian khởi động shell của tôi xuống ~ 120ms, rất nhanh.


Biên tập:

Đối với bất kỳ ai muốn các chi tiết kỹ thuật giải thích vấn đề này, tôi đã viết về vấn đề này trên các diễn đàn Homebrew . Tóm lại, lý do bash-completion@2nhanh hơn nhiều là vì nó được viết để nó không còn háo hức tải tất cả các tệp hoàn thành; thay vào đó, nó tải một tập tin hoàn thành theo yêu cầu, hoặc như tác giả mô tả, nó tải chúng theo cách không háo hức .


Tôi nghĩ rằng phiên bản Bash mặc định trên macOS vẫn là phiên bản 3.2 - Tôi không nghĩ rằng nó được phát hành cùng với Bash v4.2. Bạn có tham khảo nơi nói rằng macOS vận chuyển với Bash v4.2 + không?
nwinkler

1
@nwinkler Bạn sẽ đúng. Tôi bối rối tại sao tôi tình cờ đề cập đến điều đó, bởi vì MacOS vẫn xuất xưởng version 3.2.57(1)-release (x86_64-apple-darwin18). Cảm ơn đã chỉ ra rằng; Tôi đã xóa dòng khỏi bài viết của tôi.
danemacmillan

1
Baffling, tôi biết ... Cảm ơn đã cập nhật câu trả lời của bạn!
nwinkler

3

Với ý tưởng mà câu trả lời của Godbyk đã cho tôi, tôi thấy rằng biến PATH của tôi có một vài thư mục không có bất kỳ nhị phân nào hoặc không tồn tại, loại bỏ chúng tăng tốc đáng kể. Nói cách khác, đây là PATH mà tôi có trong bashrc của mình:

PATH="$GOPATH/bin:/some/directory/not/existing:/some/empty/directory:/some/directory/without/binaries:$PATH"

Và sau đó tôi đổi nó thành:

PATH="$GOPATH/bin:$PATH"

Điều này là do havechức năng trong quá trình hoàn thành bash đó, tìm kiếm từng lệnh và tôi có quá nhiều thư mục vô dụng sẽ được truy cập cho mỗi nhị phân đó, loại bỏ chúng tăng tốc.


Tôi cũng đã cố gắng thay đổi thời gian tải từ khoảng 5 giây thành dưới 1 giây bằng cách xóa các đường dẫn không tồn tại khỏi biến môi trường PATH của tôi.
Juriejan

0

Tôi gặp vấn đề tương tự. Một vài thủ thuật sửa lỗi đơn giản đã đưa tôi đến nguyên nhân gốc rễ.

Đầu tiên, kích hoạt DEBUG modeđể bạn có thể thấy những gì đang xảy ra:

export BASH_COMPLETION_DEBUG=true

Điều này cho phép in dài ra bàn điều khiển, do đó bạn có thể thấy lệnh cuối cùng. Bây giờ bạn có thể thực thi tập lệnh trong nền và bạn sẽ thấy những gì đang xảy ra

. /opt/local/etc/bash_completion &

Không phải của PID, mà sau đó bạn có thể theo dõi với pshoặc pstree:

pstree -p <the PID>:

| |     \-+= 82095 mfellows -bash
| |       \-+- 82103 mfellows -bash
| |         |-+- 82104 mfellows cargo --list
| |         | \--- 82106 mfellows rustc -vV --cap-lints allow

Như bạn có thể thấy, nó đã bắt đầu một số lệnh liên quan đến rỉ sét, đang mất nhiều thời gian.

Tạm thời loại bỏ /opt/boxen/homebrew/etc/bash_completion.d/cargocác triệu chứng của tôi.


-1

Nếu bạn đang chạy MacPorts> = 2.1.2 và Mountain Lion thì có vẻ như bạn đã bash_profilesai. Làm theo các hướng dẫn về Làm thế nào để git-xong.bash hoạt động trên Mac OS X? . Tôi cho rằng có thể tăng tốc độ hoàn thành tự động.

Một giải pháp khác là thử cài đặt tự động hoàn thành thông qua Fink hoặc Homebrew. Nếu nó không hoạt động, bạn có thể thử hoàn toàn một vỏ khác. Tôi đã thấy rằng Vỏ cá rất nổi bật khi hoàn thành tự động (ngoài hộp). Mặc dù phiên bản 2 vẫn đang trong giai đoạn thử nghiệm nhưng tôi rất muốn giới thiệu nó.


-1

Tôi sẽ đoán rằng bash của bạn quá cũ. Tôi đang chạy bash chứng khoán đi kèm với Mountain Lion và đây là những gì tôi thấy:

$ port info bash-completion
bash-completion @2.0, Revision 1 (sysutils)

Description:          Programmable completion library for bash. This port
                      **requires bash >=4.1** and is meant to be used together with
                      the bash port.
Homepage:             http://bash-completion.alioth.debian.org/

Runtime Dependencies: bash
Conflicts with:       bash-completion-devel
Platforms:            darwin
License:              GPL-2+
Maintainers:          raimue@macports.org

$ bash --version
GNU bash, version **3.2.48(1)-release (x86_64-apple-darwin12)**
Copyright (C) 2007 Free Software Foundation, Inc.

Tôi không thấy có lệnh cổng này. :( Làm cách nào để biết phần mềm hoàn thành tab git nào đang chạy trên máy Mac của tôi
Dean Hiller

@DeanHiller Câu trả lời này đề cập đến trình quản lý gói Macports, cung cấp lệnh cổng. Ứng dụng hoàn thành bash của Macports sẽ mới hơn ứng dụng được cung cấp với OS X.
Matt S
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.