Làm thế nào để gỡ lỗi và sửa lỗi tự động hoàn thành chậm trong bash?


26

Sau bản cập nhật gần đây (Ubuntu 12.04 LTS), TAB hoàn thành trên dòng lệnh bị chậm. Sau khi nhập lệnh một phần (ví dụ evi [TAB]) hoặc tên tệp một phần (ví dụ evince somedocu[TAB]) shell, đôi khi không phải lúc nào cũng bị treo trong vài giây.

Cá nhân, tôi thích tự động hoàn thành ít mạnh mẽ hơn chậm. Có một sửa chữa đơn giản?

Chỉnh sửa: Thông tin bổ sung liên quan đến ý kiến:

  • PATH khá chuẩn. ~ / bin có một số tập lệnh bash

    $ echo $PATH
    /home/USERNAME/bin:/usr/local/bin:/usr/bin:/bin:/usr/games
    
  • Số lượng tệp trong thư mục làm việc ít hơn 100.

  • Tính năng tự động hoàn tất đặc biệt chậm sau khi hoạt động bất thường của đĩa (nâng cấp hệ thống). Do đó, có thể, việc đọc lại / usr / bin và các thư mục khác gây ra độ trễ.

4
Không phải là bạn cho phép quản lý tốc độ ổ cứng với bản cập nhật và tự động hoàn thành chờ đĩa thức dậy để có thể tính toán tự động hoàn thành?
Vincent Nivoliers

2
Có phụ thuộc vào số lượng tập tin trong thư mục hiện tại của bạn không?
terdon

1
# Echo $ PATH nói gì? Nếu bạn có nhiều (vài chục nghìn hoặc nhiều hơn) tệp trong thư mục trong đường dẫn của mình, điều đó có thể gây ra nó.
Stephan

Câu trả lời:


28

Tôi không biết về việc sửa chữa - có tất cả các loại điều có thể gây ra sự chậm trễ. Nhưng tôi có thể đưa ra một vài lời khuyên để điều tra.

Đúng như dự đoán, có thể có một thư mục ở đâu đó trong đường dẫn tìm kiếm ( $PATHhoặc một nơi nào đó bash tìm dữ liệu hoàn thành) trên hệ thống tệp chậm phản hồi. Thông thường đó là các hệ thống tập tin từ xa chậm, nhưng nó cũng có thể là một đĩa cứng bị lỗi, trình điều khiển FUSE treo, v.v.

Bước đầu tiên để điều tra là chạy set -xđể có được dấu vết của các lệnh mà shell thực thi để tạo ra các hoàn thành. Xem nơi nó dừng lại.

Nếu điều đó không cung cấp đủ thông tin, hãy mang theo những khẩu súng lớn. Lưu ý ID tiến trình của shell ( echo $$). Trong một thiết bị đầu cuối khác, chạy strace -f -s9999 -p$$(hoặc tương đương với strace nếu chạy trên một hương vị unix khác). Strace liệt kê các cuộc gọi hệ thống được thực hiện theo quy trình. Xem nếu nó dường như đang truy cập các tệp mà nó không nên hoặc nếu truy cập vào một số tệp chậm. Thêm tùy chọn -Tvào stracedòng lệnh làm cho nó hiển thị thời gian dành cho mỗi cuộc gọi hệ thống.


1
Lượng thời gian tôi đã sử dụng Unix và không biết về set -x, đây là một lệnh hay. Rất "chế độ hacker tham gia"
Matt Fletcher

6
Ps, sử dụng set +xđể trở về chế độ không gỡ lỗi thông thường
Matt Fletcher

19

Nếu hộp * nix của bạn được thiết lập dưới dạng máy khách LDAP, bạn có thể gặp sự cố này, thậm chí đăng nhập với tư cách người dùng cục bộ.

Thông tin gỡ lỗi nhàm chán: Gỡ lỗi với set-x, tôi tìm thấy sự hoàn thành đang treo tại:

> 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

Xác nhận: Tôi xác nhận điều này với ls ~*cái nào cũng treo. Hóa ra máy chủ ldap của tôi chậm chạp, nhưng điều này không ảnh hưởng đến những thứ như hoàn thành bash và ls!

Giải pháp: Aha, có một lỗi được gửi chống lại bash-xong + ldap, nó sẽ được sửa trong phiên bản mới hơn và một bản vá đơn giản nếu bạn không muốn chờ đợi. Tab hoàn thành nhanh một lần nữa, hoan hô!

Đây là patchfile trong trường hợp liên kết biến mất. Nó chỉ đơn thuần là thoát khỏi ~ trên dòng 545 và 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

Bạn cần thoát phiên ssh hiện tại và đăng nhập lại để bản vá này có hiệu lực.


1
Tôi đã có vấn đề chính xác này và bản vá rất tốt
radman

2
Vấn đề tương tự ở đây (Debian 8,5) 2 1/3 năm trước và giải pháp hoạt động như một cơ duyên. Debian 8.6 không có vấn đề.
YoMismo

2
Tôi đã sử dụng set -xa triệu lần nhưng tôi chưa bao giờ mong đợi nó cũng hiển thị các vấn đề về hiệu suất hoàn thành, cảm ơn rất nhiều!
MarcH

Có vấn đề này với debian 9.8!
Philippe Gachoud

0

Cố gắng cài đặt lại bash-hoàn thành

sudo apt-get install --reinstall bash-completion

Đối với tôi, điều này đã được sửa trong Ubuntu 18.04.3 LTS


0

Ngoài ra một số người sử dụng các tính năng tự động hoàn thành bổ sung như Git bash auto hoàn thành . Sự chậm hoàn thành của Bash có thể là kết quả của những tính năng tự động hoàn thành thêm đó.

Trong trường hợp của tôi, đó là Git bash auto hoàn thành khóa công khai git của tôi đã được cập nhật nên nó đang thực hiện một nỗ lực xác thực thất bại gây ra treo máy. Khi tôi gỡ bỏ hoàn thành tự động, nó lại nhanh chóng. Vì vậy, giải pháp của tôi là sửa khóa và kích hoạt lại.

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.