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?
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?
Câu trả lời:
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 su
cho biết
khi hoàn thành một đối số cho su
lệ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_completion
chứ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
.
/etc/bash_completion
(ít nhất, đó là nơi có rất nhiều điều kỳ diệu trong Debian).