Làm thế nào để Bash hoàn thành tự động làm việc?


9

Tôi có thể hiểu rằng bash auto hoàn thành hoạt động cho các tiện ích tiêu chuẩn. Nhưng làm thế nào để nó tự động hoàn thành cho các chương trình tùy chỉnh như trình tải SQL của Oracle?

Trong lệnh sau nếu bạn Tab sau control=đó nó sẽ tự động hoàn thành tên tệp điều khiển:

sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log

Làm thế nào để nó biết nó phải điền vào tệp điều khiển tại thời điểm đó chứ không phải một số tệp khác?


2
Hoàn thành các tham số được thực hiện với các chức năng. Hầu hết trong số họ được thiết lập trong /etc/bash_completion.d. Xem thêm /etc/bash_completionvà hãy xem đầu ra của set, môi trường của bạn đã phát triển bao nhiêu.
ott--

@ott Tôi nên tìm gì ở vị trí đó? Tôi không thể thấy bất cứ điều gì liên quan đến sqlldr. Tất cả những gì tôi có là : gdbus-bash-completion.sh gvfs-bash-completion.sh pk-completion.bash yum.bash. Đầu ra của setchỉ là không thú vị.
Kshitiz Sharma

Nó cũng có thể được thực hiện trong một số kịch bản từ /etc/profile.d. Hoặc có thể của bạn .bash_profilehoặc .bashrcđã được sửa đổi.
ott--

Làm thế nào là các chức năng khác với chức năng bình thường. Và làm thế nào tôi đi về việc xác định của riêng tôi để cung cấp tự động hoàn thành cho một tập lệnh tùy chỉnh? Bạn có thể chỉ đúng hướng?
Kshitiz Sharma

1
@KshitizSharma, bash-completiontải hoàn thành linh hoạt kể từ đó 1.90. Hãy thử : sqlldr<space><tab><enter>. Sau đó gõ complete -p sqlldr.
Evgeny Vereshchagin

Câu trả lời:


6

Hoàn thành lập trình của Bash hoạt động bằng cách phân tích dòng lệnh và tìm hiểu những gì đang được hoàn thành:

  1. Một số bối cảnh được xử lý đặc biệt, ví dụ từ đầu tiên trong lệnh được hoàn thành dưới dạng tên lệnh, phần tiếp theo $được hoàn thành dưới dạng tên biến, v.v.
  2. Bên ngoài các bối cảnh này, bash cố gắng hoàn thành đối số của lệnh và cài đặt cho lệnh hoặc không thành công (thường là trường hợp) cho tên cơ sở của lệnh được áp dụng.

Ví dụ, sau , bash hoàn thành các tên lệnh bắt đầu bằng . Sau đó , bash hoàn thành các tên biến bắt đầu bằng . Sau đó , bash áp dụng các quy tắc hoàn thành cho lệnh . Quy tắc hoàn thành có thể chỉ định một danh mục (người dùng, biến, tệp, v.v.), mẫu ký tự đại diện cho tên tệp hoặc đoạn mã hoặc đoạn mã để thực thi.sqllTabsqllsqlldr $aTabasqlldr Tabsqlldr

Quy tắc hoàn thành được xác định bởi completenội dung. Bash không theo dõi khi nào completenội dung được gọi hoặc tập lệnh nào (nếu có). Hầu hết các bản phân phối đều gửi gói hoàn thành bash , cung cấp một loạt các quy tắc cho các lệnh chung. Điều này có dạng một loạt các tập tin chứa các lệnh gọi complete, với một tập lệnh phải được đọc từ .bashrc(hoặc /etc/bash.bashrcnếu được triển khai) để tải tất cả các tập lệnh này: thường . /etc/bash_completionlà cần thiết để kích hoạt hoàn thành lập trình và tải các tập lệnh có sẵn.

Gói tiêu chuẩn không bao gồm hỗ trợ cho sqlldr. Nếu bạn có sự hỗ trợ như vậy, nó phải đến từ một nguồn khác. Nguồn này có thể đã bỏ một tệp trong một thư mục như /etc/bash_completion.dhoặc có thể có các hướng dẫn để bao gồm một số mã trong của bạn .bashrc. Bạn có thể sử dụng complete -p sqlldrđể xem các quy tắc hiện hành cho sqlldr; như đã đề cập trước đây, điều này sẽ không cho bạn biết những quy tắc đó được tải từ đâu.

Tcsh, zsh và cá có cơ chế hơi giống nhau (mọi người đều lấy cảm hứng từ tcsh) nhưng các nội dung, cú pháp và khả năng khác nhau.


vâng, bạn không thể xác định vị trí completeđược gọi. Nhưng bạn có thể tìm thấy tên tệp nguồn và số dòng nơi chức năng hoàn thành được xác định. complete -p sudo # outputs complete -F _sudo sudo, shopt -s extdebug, declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo. (Nhưng xem nhận xét của tôi về tải hoàn thành động và complete -p).
Evgeny Vereshchagin

and the settings for the basename of the command are applied. Không. Bạn có thể có một compspec khác nhau cho date/bin/date. Tham chiếu cho biết : Nếu từ lệnh là tên đường dẫn đầy đủ, một compspec cho tên đường dẫn đầy đủ được tìm kiếm trước tiên. Nếu không tìm thấy compspec cho tên đường dẫn đầy đủ, một nỗ lực được thực hiện để tìm một compspec cho phần sau dấu gạch chéo cuối cùng
Evgeny Vereshchagin
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.