Làm thế nào để hoàn thành tab bash hoạt động?


113

Gần đây, tôi đã dành rất nhiều thời gian trong trình bao và tôi đang tự hỏi làm thế nào tính năng tự động hoàn thành tab hoạt động. Cơ chế đằng sau nó là gì? Làm thế nào để bash biết nội dung của mọi thư mục?


2
Bạn có thể muốn kiểm tra /etc/bash_completion(ít nhất, đó là nơi có rất nhiều điều kỳ diệu trong Debian).
Wrikken

1
@Wrikken: Đó là bash_completion, điều này phụ thuộc vào việc hoàn thành tab nhưng không hoàn toàn như thế nào.
Ignacio Vazquez-Abrams

Câu trả lời:


100

Tự động hoàn thành có hai phần:

  • Thư viện dòng đọc, như đã được fixje đề cập, quản lý việc chỉnh sửa dòng lệnh và gọi lại bash khi nhấn tab, để cho phép hoàn thành. Sau đó, Bash đưa ra (xem điểm tiếp theo) một danh sách các hoàn thành có thể xảy ra và dòng đọc sẽ chèn càng nhiều ký tự càng được xác định rõ ràng bởi các ký tự đã được nhập vào. (Bạn có thể định cấu hình thư viện dòng đọc khá nhiều, xem phần Chỉnh sửa dòng lệnh của Bash hướng dẫn sử dụng để biết chi tiết.)

  • Bản thân Bash có tích hợp sẵn completeđể xác định cơ chế hoàn thành cho các lệnh riêng lẻ. Nếu đối với lệnh hiện tại không có gì được xác định, nó đã sử dụng hoàn thành theo tên tệp (sử dụng opendir / readdir, như Ignacio đã nói).

    Phần xác định phần hoàn thành của riêng bạn được mô tả trong phần Phần hoàn thành có thể lập trình . Tóm lại, với việc complete «options» «command»bạn xác định hoàn thành cho một số lệnh. Ví dụ complete -u sucho biết khi hoàn thành một đối số cho sulệnh, hãy tìm kiếm người dùng của hệ thống hiện tại .

    Nếu điều này phức tạp hơn các tùy chọn bình thường có thể bao gồm (ví dụ: các phần hoàn chỉnh khác nhau tùy thuộc vào chỉ mục đối số hoặc tùy thuộc vào các đối số trước đó), bạn có thể sử dụng -F function, sau đó sẽ gọi hàm shell để tạo danh sách các phần hoàn chỉnh có thể có. (Ví dụ: Điều này được sử dụng cho việc hoàn thành git, rất phức tạp, tùy thuộc vào lệnh con và đôi khi tùy chọn được đưa ra, và đôi khi sử dụng tên của các nhánh (không có gì cơ bản biết về).

Bạn có thể liệt kê các hoàn thành hiện có được xác định trong môi trường bash hiện tại của mình bằng cách sử dụng đơn giản complete, để có ấn tượng về những gì có thể. Nếu bạn đã cài đặt gói hoàn thành bash (hoặc tuy nhiên nó được đặt tên trên hệ thống của bạn), thì các hoàn thành cho rất nhiều lệnh sẽ được cài đặt và như Wrikken đã nói, /etc/bash_completionchứa một tập lệnh bash sau đó thường được thực thi khi khởi động trình bao để định cấu hình điều này. Các tập lệnh hoàn thành tùy chỉnh bổ sung có thể được đặt trong /etc/bash_completion.d; tất cả đều có nguồn gốc từ /etc/bash_completion.


1
Trang người đàn ông chỉ ở đó cho các lệnh độc lập, không dành cho nội trang vỏ. Nhưng nó là một phần của sổ tay bash mà tôi đã liên kết.
Paŭlo Ebermann

7

Nếu bạn quan tâm đến những điều cơ bản: Bash sử dụng readline có tính năng lịch sử và hoàn thành cơ bản. Bạn có thể kiểm tra nguồn nếu bạn muốn hiểu chi tiết. Hơn nữa, bạn có thể sử dụng readline để xây dựng các giao diện CLI của riêng mình khi hoàn thành

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.