Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

10 Ví dụ về lệnh hoàn chỉnh hữu ích cho Linux Bash_Completion (Hoàn thành dòng lệnh Bash trên Steroid)

Trong Linux, khi nhập một lệnh nếu bạn nhấn TAB hai lần, nó sẽ liệt kê tất cả các lệnh có sẵn bắt đầu bằng các ký tự đã nhập.

Điều này không có gì mới, có thể bạn đã biết về điều này. Chức năng này được gọi là hoàn thành bash. Hoàn thành tên thư mục và tệp cơ bản có sẵn theo mặc định trong dòng lệnh bash.

Tuy nhiên, chúng tôi có thể tăng tốc tính phí hoàn thành bash này và đưa nó lên cấp độ tiếp theo bằng cách sử dụng lệnh hoàn chỉnh.

Hướng dẫn này giải thích cách chúng ta có thể áp dụng tính năng tự động hoàn thành cho các tùy chọn và đối số của lệnh bằng cách sử dụng tính năng hoàn thành có thể lập trình.

Ví dụ:sau khi nhập lệnh write, nếu bạn nhấn tab hai lần, tính năng tự động hoàn thành sẽ cung cấp danh sách người dùng để thực hiện thao tác ghi.

$ write [TAB][TAB]
bala raj
jason randy
john ritu
mayla thomas
nisha www-data

Trong ví dụ sau, nó sẽ hiển thị các tên máy chủ khả dụng cho lệnh telnet:

$ telnet [TAB][TAB]
localhost dev-db fileserver

Để hoàn thành có thể lập trình trong thiết bị đầu cuối của bạn, bạn chỉ cần chạy / etc / bash_completion như hình dưới đây,

# . /etc/bash_completion

Bạn cũng có thể bỏ ghi chú các dòng dưới đây trong /etc/bash.bashrc (từ ubuntu linux 13.04) để bạn không phải chạy lệnh trên một cách rõ ràng,

 enable bash completion in interactive shells
if ! shopt -oq posix; then
 if [ -f /usr/share/bash-completion/bash_completion ]; then
 . /usr/share/bash-completion/bash_completion
 elif [ -f /etc/bash_completion ]; then
 . /etc/bash_completion
 fi
fi

Trong trường hợp nếu bạn không tìm thấy những dòng này và tệp / etc / bash_completion, thì bạn chỉ cần cài đặt gói có tên bash_completion by apt-get

1. Xem hoàn thành bash hiện tại

Sau khi cho phép hoàn thành bash có thể lập trình, có một tập hợp hoàn thành bash được xác định. Lệnh hoàn thành được sử dụng để xác định hoàn thành bash.

Để xem quá trình hoàn thành bash hiện có, hãy sử dụng lệnh hoàn chỉnh như được hiển thị bên dưới.

 
complete -p | less

Tùy chọn -p là tùy chọn trong ví dụ trên.

2. Danh sách Hoàn thành Tiêu chuẩn trong Bash

Bash cung cấp hoàn thành tiêu chuẩn sau cho người dùng Linux theo mặc định.

  1. Hoàn thành tên biến
  2. Hoàn thành tên người dùng
  3. Hoàn thành tên máy chủ
  4. Hoàn thành tên đường dẫn
  5. Hoàn thành tên tệp

Chúng tôi đã thảo luận về những điều này trong bài viết hoàn thành tiêu chuẩn bash trước đó của chúng tôi.

3. Xác định quá trình hoàn thành để nhận lệnh

Định nghĩa một lệnh hoàn thành bằng -c để lấy danh sách lệnh có sẵn làm đối số. Trong ví dụ sau, việc hoàn thành được xác định cho lệnh nào,

$ complete -c which

$ which [TAB][TAB]
Display all 2116 possibilities? (y or n)

Như đã thấy ở trên, bằng cách nhấn ‘y’, tất cả các lệnh sẽ được liệt kê.

4. Xác định quá trình hoàn thành để lấy thư mục

Với tùy chọn d, việc hoàn thành có thể được định nghĩa để chỉ lấy tên thư mục làm đối số. Trong ví dụ sau, hoàn thành được xác định cho ls,

$ ls
countfiles.sh dir1/ dir2/ dir3/

$ complete -d ls

$ ls [TAB][TAB]
dir1/ dir2/ dir3/

Như đã thấy ở trên, nhấn tab chỉ hiển thị cho bạn các thư mục.

5. Xác định việc hoàn thành để có được tên công việc cơ bản

Với hoàn thành, cũng có thể lấy tên công việc làm đối số cho các lệnh. Tùy chọn j được sử dụng để chuyển tên công việc làm đối số cho lệnh công việc như được hiển thị bên dưới,

$ jobs
[1]- Stopped cat
[2]+ Stopped sed 'p'

$ complete -j ./list_job_attrib.sh

$ ./list_job_attrib.sh [TAB][TAB]
cat sed

Nói về các công việc nền, bạn cũng nên biết cách quản lý các công việc nền Linux bằng cách sử dụng các ví dụ này.

6. Hoàn thành với Tiền tố và Hậu tố

Các hoàn thành có thể được xác định với tiền tố mong muốn được thêm vào và hậu tố được thêm vào với các hoàn thành thực tế. Trong ví dụ sau, tiền tố và hậu tố được xác định cho list_job_attrib.sh,

$ jobs 
[1]+ Stopped cat

$ complete -P '">' -S '<"' ./list_job_attrib.sh

$ ./list_job_attrib.sh [TAB][TAB]

$ ./list_job_attrib.sh ">cat<"

7. Hoàn thành tên tệp và thư mục với loại trừ

Hãy xem xét rằng tập lệnh hoàn tất quá trình chạy của nó, đầu ra được ghi vào thư mục đầu ra như sau

$ cd output/

$ ls
all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt
parser_mod.tmp extract.o

Ở phần trên, nếu bạn cần bỏ qua các tệp .tmp và .o để tự động hoàn thành bằng lệnh ls thì hãy

$ export FIGNORE='.tmp:.o'

$ complete -f -d ls

$ cd output

$ ls [TAB][TAB]
all_calls.txt incoming_calls.txt outgoing_calls.txt missed_calls.txt

FIGNORE là biến shell chứa hậu tố của tên tệp và những tên đó sẽ bị loại trừ trong quá trình tự động hoàn thành.

8. Chia một chuỗi theo IFS để nhận Giá trị hoàn thành

Danh sách từ có thể được đề cập với tùy chọn -W và được chia với giá trị trong biến IFS. Sau đó, mỗi từ kết quả được mở rộng và sẽ được hiển thị để hoàn thành,

$ export IFS=" "

$ complete -W "bubble quick" ./sort_numbers.sh

$ ./sort_numbers.sh [TAB][TAB]
bubble quick

Như đã trình bày ở trên, sau khi tách chuỗi bằng máy đo tốc độ IFS, từ này sẽ được mở rộng, vì vậy cũng có thể có chúng dưới dạng các biến như được hiển thị bên dưới,

$ echo $SORT_TYPE1
bubble

$ echo $SORT_TYPE2
quick

$ complete -W "$SORT_TYPE1 $SORT_TYPE2" ./sort_numbers.sh
$ ./sort_numbers.sh [TAB][TAB]
bubble quick

9. Viết chức năng của riêng bạn để tạo ra sự hoàn thành

Nó cho phép bạn bao gồm một chức năng để xác định sự hoàn thành. Với tùy chọn -F, tên hàm được chuyển cho lệnh hoàn thành và nó được thực thi để tạo các lệnh hoàn thành. Ví dụ, các hàm được viết như hình dưới đây,

_parser_options()
{
 local curr_arg;

 curr_arg=${COMP_WORDS[COMP_CWORD]}

 COMPREPLY=( $(compgen -W '-i --incoming -o --outgoing -m --missed' -- $curr_arg ) );
}

ở đâu trong hàm trên,

  1. COMPREPLY:mảng chứa kết quả hoàn thành được hiển thị sau khi nhấn [TAB] [TAB]
  2. COMP_WORDS:mảng các từ được nhập trên dòng lệnh
  3. COMP_CWORD:chỉ mục cho mảng COMP_WORDS và sử dụng các từ vị trí khác nhau này trên dòng lệnh có thể được truy cập.
  4. compgen:-W nắm giữ các hoàn thành có thể có và đối số tương ứng được chọn dựa trên $ current_arg

Hàm này có trong tệp parser_option được lấy nguồn như hình dưới đây,

$ source parser_option

Liên kết hàm này với tập lệnh phân tích cú pháp của bạn như được hiển thị bên dưới,

$ complete -F _parser_options ./parser.pl

$ ./parser.pl [TAB][TAB]
-i --incoming -o --outgoing -m --missed

Như đã thấy ở trên, các tùy chọn cho trình phân tích cú pháp được tạo bởi hàm _parser_options ().

Lưu ý:Xem / etc / bash_completion để xem các chức năng khác để hoàn thành có thể lập trình.

10. Thông số phụ khi Thông số chính không tạo ra bất kỳ

Nếu không có kết quả phù hợp nào được tạo bởi thông số kỹ thuật hoàn thành đã xác định, thì tùy chọn tổng hợp đang được thực hiện để hoàn thành được đề cập với tùy chọn -o.

$ complete -F _count_files -o dirnames ./countfiles.sh

Như trên, việc hoàn tất được định nghĩa bằng hàm _count_files cho tệp ./countfiles.sh. Nếu hàm _count_files () không tạo ra bất kỳ kết quả phù hợp nào thì việc hoàn thành thư mục sẽ được thử.

$ ls 
countfiles.sh dir1/ dir2/ dir3/

$./countfiles.sh [TAB][TAB]
dir1 dir2 dir3