Làm cách nào để chỉ định tự động hoàn thành tùy chỉnh cho các lệnh cụ thể?


25

Có cách nào để bash biết chính xác những gì sẽ hiển thị khi bạn nhân đôi tab không? Ví dụ, tôi có một kịch bản python scpyyêu cầu một vài đối số. Ví dụ như apt-get, nếu tab đôi của bạn cung cấp cho bạn

autoclean build-dep sạch DSelect-nâng cấp nguồn thanh lọc
tự động kiểm tra cài đặt nâng cấp cài đặt bản cập nhật  

Có cách nào để làm điều đó cho các kịch bản / chương trình của riêng bạn không? Tôi có cần phải bọc kịch bản python của mình trong một tập lệnh bash không?

Câu trả lời:


31

Cách dễ nhất để làm điều này là bao gồm một tập lệnh shell /etc/bash_completion.d/. Cấu trúc cơ bản của tệp này là một hàm đơn giản thực hiện việc hoàn thành và sau đó gọi completeđó là một hàm bash. Thay vì đi sâu vào chi tiết về cách sử dụng complete, tôi khuyên bạn nên đọc phần Giới thiệu về Hoàn thành Bash . Phần 1 trình bày những điều cơ bản và Phần 2 nói về cách bạn sẽ viết về một kịch bản hoàn thành.

Có thể tìm thấy mô tả dày đặc hơn về hoàn thành bash trong phần "Hoàn thành có thể lập trình" của man bash(bạn có thể nhập "/ Hoàn thành có thể lập trình" và sau đó nhấn 'n' một vài lần để đến đó nhanh chóng. Hoặc, nếu bạn cảm thấy may mắn, "g 2140 TRẢ LẠI ").


8

Dưới đây là hướng dẫn cơ bản.

Hãy có một ví dụ về tập lệnh được gọi là admin.sh mà bạn muốn tự động hoàn thành.

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_1
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

Lưu ý danh sách rút gọn tùy chọn. Tập lệnh gọi với tùy chọn này sẽ in ra tất cả các tùy chọn có thể cho tập lệnh này.

Và ở đây bạn có kịch bản tự động hoàn thành:

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur prev
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

Lưu ý rằng đối số cuối cùng cần hoàn thành là tên của tập lệnh bạn muốn thêm tự động hoàn thành. Tất cả những gì bạn cần làm là thêm tập lệnh tự động hoàn tất vào bashrc như

source /path/to/your/autocomplete.sh

hoặc sao chép nó vào /etc/bash.completion.d

Nguồn: https://askubfox.com/a/483149/24155


3
'hướng dẫn hoàn chỉnh' không phải là cụm từ tôi sẽ sử dụng để mô tả điều này ...
searchengine27
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.