2009-02-04 28 views

Trả lời

30

Bạn sẽ có thể sử dụng lệnh compgen, như vậy:

compgen -A builtin [YOUR STRING HERE] 

Ví dụ, "compgen -A BUILTIN l" trả

let 
local 
logout 

Bạn có thể sử dụng các từ khóa khác trong vị trí của "nội trang" để có được các loại hoàn thành khác. Builtin cung cấp cho bạn các lệnh nội trang hệ vỏ. "File" mang đến cho bạn tên tập tin địa phương, vv

Dưới đây là danh sách các hành động (từ trang người đàn ông BASH cho hoàn trong đó sử dụng compgen):

alias  Alias names. May also be specified as -a. 
    arrayvar Array variable names. 
    binding Readline key binding names. 
    builtin Names of shell builtin commands. May also be specified as -b. 
    command Command names. May also be specified as -c. 
    directory Directory names. May also be specified as -d. 
    disabled Names of disabled shell builtins. 
    enabled Names of enabled shell builtins. 
    export  Names of exported shell variables. May also be specified as -e. 
    file  File names. May also be specified as -f. 
    function Names of shell functions. 
    group  Group names. May also be specified as -g. 
    helptopic Help topics as accepted by the help builtin. 
    hostname Hostnames, as taken from the file specified by the HOSTFILE shell 
       variable. 
    job  Job names, if job control is active. May also be specified as 
       -j. 
    keyword Shell reserved words. May also be specified as -k. 
    running Names of running jobs, if job control is active. 
    service Service names. May also be specified as -s. 
    setopt  Valid arguments for the -o option to the set builtin. 
    shopt  Shell option names as accepted by the shopt builtin. 
    signal  Signal names. 
    stopped Names of stopped jobs, if job control is active. 
    user  User names. May also be specified as -u. 
    variable Names of all shell variables. May also be specified as -v. 
+0

. tôi đấu tranh với điều đó và hoàn thành, nhưng không thể tìm ra cách sử dụng nó. +1 :) –

+0

cực kỳ hữu ích thực sự, và câu trả lời rất tốt đẹp. Cảm ơn! (+1) –

0

Lặp lại biến $ PATH và làm ls beginningofword* cho mỗi thư mục trong đường dẫn?

Để làm cho nó chính xác tương đương, bạn sẽ cần phải lọc ra các tệp thực thi và sắp xếp theo tên (nên khá dễ dàng với cờ ls và lệnh sắp xếp).

0

Điều gì được liệt kê khi bạn nhấn là các tệp nhị phân trong PATH của bạn bắt đầu bằng chuỗi đó. Vì vậy, nếu biến PATH của bạn có chứa: PATH =/usr/local/bin:/usr/bin:/bin:/usr/trò chơi:/usr/lib/java/bin:/usr/lib/java/jre/bin :/usr/lib/qt/bin:/usr/share/texmf/bin :.

Bash sẽ xem xét từng thư mục đó để hiển thị cho bạn các đề xuất khi bạn nhấn. Do đó, để lấy danh sách các lệnh bắt đầu bằng "ls" thành biến bạn có thể làm: MYVAR = $ (ls/usr/local/bin/ls */usr/bin/ls */bin/ls *) Tự nhiên bạn có thể thêm tất cả các thư mục khác mà tôi chưa có.

+0

Xem câu trả lời của tôi bên dưới để biết cách nhanh chóng phân tích cú pháp $ PATH (không phải ý tưởng của tôi, tôi đã đánh cắp nó) ... – dmckee

1

Nếu bạn muốn chính xác bash sẽ như thế nào hoàn thành

COMPLETIONS=$(compgen -c "$WORD") 

kết hợp hoàn thành bằng cách sử dụng cùng một quy tắc sử dụng khi tabbing.

1

Câu trả lời của JacobM thật tuyệt vời. Để thực hiện nó bằng tay, tôi sẽ sử dụng một cái gì đó như thế này:

echo $PATH | tr : '\n' | 
while read p; do 
    for i in $p/mod*; do 
    [[ -x "$i" && -f "$i" ]] && echo $i  
    done 
done 

Các thử nghiệm trước khi đầu ra đảm bảo chỉ thực thi, các file thường xuyên được hiển thị. Ở trên cho thấy tất cả các lệnh bắt đầu bằng mod.

1

Thú vị, tôi không biết về compgen.Dưới đây là một kịch bản tôi đã sử dụng để làm điều đó, mà không kiểm tra không thực thi:

#!/bin/bash 
echo $PATH | tr ':' '\0' | xargs -0 ls | grep "[email protected]" | sort 

Lưu kịch bản mà ở đâu đó trong $PATH của bạn (tôi đặt tên nó findcmd), chmod u+w nó, và sau đó sử dụng nó giống như grep, đi qua các lựa chọn và mô hình yêu thích của bạn:

findcmd ^foo # finds all commands beginning with foo 
findcmd -i -E 'ba+r' # finds all commands matching the pattern 'ba+r', case insensitively 
+0

Danh sách này có sẵn không? – legends2k

0

Just for fun, một tay biến thể:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f -perm -001 -print 

nơi pattern chỉ định mẫu tên tệp bạn muốn sử dụng. Điều này sẽ bỏ lỡ các lệnh không thực thi trên toàn cầu, nhưng bạn có quyền cho phép.

[thử nghiệm trên Mac OS X]


Sử dụng -or-and cờ để xây dựng một phiên bản toàn diện hơn về lệnh này:

find -L $(echo $PATH | tr ":" " ") -name 'pattern' -type f 
            \(\ 
             -perm -001 -or \ 
             \(-perm -100 -and -user $(whoami)\) \ 
            \) -print 

sẽ chọn các tập tin bạn được phép cho bởi đức hạnh của việc sở hữu chúng. Tôi không thấy một cách chung để có được tất cả những gì bạn có thể thực hiện bởi đức hạnh của nhóm liên kết mà không có nhiều mã hóa hơn.

2

Cách thú vị để thực hiện việc này là nhấn M-* (Meta thường là Alt trái).

Ví dụ, gõ này:

$ lo 

Sau đó nhấn M-*:

$ loadkeys loadunimap local locale localedef locale-gen locate 
    lockfile-create lockfile-remove lockfile-touch logd logger login 
    logname logout logprof logrotate logsave look lorder losetup 

Bạn có thể đọc thêm về điều này trong man 3 readline; đó là một tính năng của thư viện readline.

Các vấn đề liên quan