Làm thế nào để tạo một cụm từ có thể mở rộng đặc biệt trong bash?


12

Tôi thấy mình làm <command> --help | grep <feature>rất rất thường xuyên hàng ngày. Tôi đã tự hỏi nếu có thể làm một cái gì đó như thế ^^mở rộng ra "--help | grep"và sau đó tôi làm điều này:

ls ^^ size

Điều đó sẽ thực hiện như sau:

ls --help | grep size

Câu trả lời:


17

Bạn có thể sử dụng hàm bash cho điều đó:

Đặt phần sau vào ~ / .bashrc:

qh() {
    type -all "$1" ; { man "$1" || "$1" --help ;} | egrep -i -- "$2"
}

Khi bạn lưu bạn bashrc làm source ~/.bashrcthì bạn có thể làm:

$ qh ls size
      --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                               '--block-size=M' prints sizes in units of
  -h, --human-readable       with -l and/or -s, print human readable sizes
  -s, --size                 print the allocated size of each file, in blocks
  -S                         sort by file size, largest first
      --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
  -T, --tabsize=COLS         assume tab stops at each COLS instead of 8

1
bạn nên trích dẫn $ 1 và $ 2. Tôi sẽ thay đổi điều này thành: qh () { type -all "$1" ; { "$1" --help || man "$1" ;} | egrep -i -- "$2" ;} # do đó bạn có thể: kích thước qh ls, qh ls "cái gì đó | cái khác", v.v. (tùy chọn) type -all "$1"cũng thêm thông tin về $ 1: thông báo nếu bạn sẽ khởi chạy bí danh, hàm, a lệnh, v.v. Và nó đưa ra thông tin từ người đàn ông "$ 1" nếu lệnh $ 1 không có tùy chọn "- trợ giúp" (điều này đôi khi xảy ra)
Olivier Dulac

1
@OlivierDulac Bạn có thể vui lòng giải thích thêm một chút về loại -all "$ 1" không? Trong trường hợp nào nó sẽ là cần thiết?
tgwtdt

Phiên bản loại của tôi (kubfox 16.04) biết về -a, nhưng không nói gì về -lhoặc -all, nhưng chức năng không hoạt động.
Joe

15

Với zsh, bạn sẽ sử dụng một bí danh toàn cầu :

$ alias -g '^^=--help|grep --color -i'
$ ls ^^ size
     --block-size=SIZE      scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
                              1,048,576 bytes; see SIZE format below
 -h, --human-readable       with -l and/or -s, print human readable sizes
 -s, --size                 print the allocated size of each file, in blocks
 -S                         sort by file size, largest first
     --sort=WORD            sort by WORD instead of name: none (-U), size (-S),
 -T, --tabsize=COLS         assume tab stops at each COLS instead of 8
The SIZE argument is an integer and optional unit (example: 10K is 10*1024)

Với bash, bạn có thể sử dụng mở rộng lịch sử , một trong những điều xảy ra đủ sớm trong phân tích cú pháp shell mà nó có thể hoạt động khi thay thế một đường ống:

  1. Đánh dấu lịch sử bằng một văn bản bạn muốn thay thế và một ký tự đặc biệt mà bạn không thể sử dụng bằng cách khác (như £ở đây xảy ra trên bàn phím của tôi):

     $ --help $(: £)|grep
     bash: --help: command not found
     Usage: grep [OPTION]... PATTERN [FILE]...
     Try 'grep --help' for more information.
  2. Sau đó, sử dụng mở rộng lịch sử để truy xuất rằng:

    $ ls !?£? size
    ls --help $(: £)|grep size
         --block-size=SIZE  scale sizes by SIZE before printing them; e.g.,
                              '--block-size=M' prints sizes in units of
     -h, --human-readable   with -l and/or -s, print human readable sizes
     -s, --size             print the allocated size of each file, in blocks
     -S                     sort by file size, largest first
         --sort=WORD        sort by WORD instead of name: none (-U), size (-S),
     -T, --tabsize=COLS     assume tab stops at each COLS instead of 8

Hoặc bạn có thể readlinemở rộng --help|grepkhi nhấn một số phím hoặc chuỗi phím. Để chỉ áp dụng cho bash(và không áp dụng cho các ứng dụng khác như gdbsử dụng readline), bạn có thể sử dụng lệnh bindbash dựng sẵn, đó là bashAPI để định cấu hình readline, ví dụ như trong ~/.bashrc:

bind '"^^": "--help|grep "'

Hoặc thêm vào ~/.inputrc(tệp cấu hình của readline):

$if Bash
"^^": "--help|grep "
$endif

(có vỏ khác như rchay esrằng việc sử dụng readline và nơi làm điều đó ràng buộc có thể có ý nghĩa nhưng AFAICT, họ không thiết lập các rl_readline_namebiến trước khi gọi readline, do đó bạn sẽ không thể thêm một số $ifbáo cáo cho họ (họ sẽ hiển thị như othergiống như tất cả các ứng dụng sử dụng readline mà không cho biết tên ứng dụng của họ)).

Lưu ý rằng bạn cần nhập cái thứ hai ^trong vòng nửa giây (theo mặc định) sau cái thứ nhất để thay thế xảy ra.


Bạn có thể giải thích giải pháp đọc thêm một chút nữa không?! Tôi nên thêm ràng buộc đó ở đâu? Những ứng dụng nào sẽ mở rộng ràng buộc?
yukashima huksay

@yukashimahuksay, xem chỉnh sửa
Stéphane Chazelas

8

Bạn có thể sử dụng các ràng buộc readline:

thêm một dòng như

"^^": "--help | grep "

tới ~ / .inputrc của bạn

Sau đó nhấn ^ X ^ R trong thuật ngữ của bạn và liên kết sẽ được kích hoạt.

Khóa ls ^^bây giờ sẽ dẫn đến ls --help | grep.


Tôi đã trả lời trước khi tôi thấy rằng Stephane đã thêm giải pháp đọc. Tôi đã xóa câu trả lời của mình, nhưng sau đó xóa bỏ, khi tôi thấy bình luận hỏi về chi tiết cho giải pháp đọc
Alex Stragies

2
Bây giờ tôi đã thêm một số điều nữa vào câu trả lời của tôi.
Stéphane Chazelas

1
Cả hai câu trả lời được nhắm mục tiêu như của bạn và những câu trả lời toàn diện như của Stéphane đều có vị trí của chúng. Có một upvote!
giám mục

5

Sử dụng lessđể xem thông báo trợ giúp

Bạn có thể thấy hữu ích khi xem ngữ cảnh xung quanh của các dòng khớp với truy vấn tìm kiếm của bạn.

hh () { "${1}" --help | less -p "${2}" ; }

Cú pháp gọi bashhàm này tương tự như hàm qhtrong câu trả lời của @ tgwtdt, với đối số đầu tiên là lệnh để kiểm tra và đối số thứ hai là thuật ngữ tìm kiếm. Ví dụ:

hh ls size
hh ls "symbolic link"

Thao tác này sẽ mở thông báo trợ giúp đầy đủ less, nêu bật mọi phiên bản của cụm từ tìm kiếm và cuộn đến phiên bản đầu tiên của cụm từ tìm kiếm. Sau đó, bạn có thể nhấn nđể cuộn về phía trước dòng tiếp theo chứa cụm từ tìm kiếm, nmột lần nữa cho dòng tiếp theo, v.v. Để cuộn trở lại phiên bản trước, nhấn N. Sử dụng Home, End, Page Up, Page Down, Up Arrow, và Down Arrowcác phím để điều hướng chung. Nhấn qhoặc Qđể thoát lessvà trở về dòng lệnh.


3

Tôi thích giải pháp của @tgwtdt, vì vậy tôi đã nâng cao nó một chút.

Điều này làm điều tương tự, nhưng làm một chút để xử lý lỗi và cũng cố gắng xử lý các phần dựng sẵn.

qh sử dụng () thay vì {} vì vậy qh1 () và out là cục bộ (trong một nhánh con).

function qh () (
    function qh1 () {
      out="$(help "$1" 2>&1 )"
      [ $? -ne 0 ] && return 1
      echo "$out"
    }

    type -all "$1" ; { qh1 "$1" || "$1" --help 2>/dev/null || man "$1" 2>/dev/null ;} | egrep -i -- "$2"
) 
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.