Lệnh Linux để liệt kê tất cả các lệnh và bí danh có sẵn


280

Có một lệnh Linux sẽ liệt kê tất cả các lệnh và bí danh có sẵn cho phiên cuối này không?

Như thể bạn đã gõ 'a' và nhấn tab, nhưng với mỗi chữ cái trong bảng chữ cái. Hoặc chạy 'bí danh' nhưng cũng trả về các lệnh.

Tại sao? Tôi muốn chạy như sau và xem nếu một lệnh có sẵn:

ListAllCommands | grep searchstr

nhấn nút TAB hai lần để liệt kê tất cả các lệnh có sẵn với môi trường
ntshetty

Câu trả lời:


599

Bạn có thể sử dụng bash (1) tích hợp compgen

  • compgen -c sẽ liệt kê tất cả các lệnh bạn có thể chạy.
  • compgen -a sẽ liệt kê tất cả các bí danh bạn có thể chạy.
  • compgen -b sẽ liệt kê tất cả các tích hợp bạn có thể chạy.
  • compgen -k sẽ liệt kê tất cả các từ khóa bạn có thể chạy.
  • compgen -A function sẽ liệt kê tất cả các chức năng bạn có thể chạy.
  • compgen -A function -abck sẽ liệt kê tất cả những điều trên trong một lần.

Kiểm tra trang man để biết các hoàn thành khác mà bạn có thể tạo.

Để trả lời trực tiếp câu hỏi của bạn:

compgen -ac | grep searchstr

nên làm những gì bạn muốn.


1
Có tương đương với điều này cho csh / tcsh? Những thiết bị đầu cuối đó cũng có một số loại chức năng tự động hoàn thành được sử dụng trên tab, vì vậy có thể có một cái gì đó tồn tại?
krb686

2
Thay vào đó compgen | grep, có thể hiệu quả hơn khi truyền chuỗi dưới dạng đối số cho compgenchính nó (nếu nó được biết là tiền tố, như được ngụ ý trong câu hỏi). Trong trường hợp này, đó sẽ là compgen -ac searchstr.
Toby Speight

Trên thực tế, Ubuntu cho thấy 'không có gì phù hợp' whatis compgenvà 'Không có mục nhập thủ công' cho man compgen.
MarAvFe

1
@MarAvFe: Đó là bởi vì nó là một lệnh tích bashhợp, không phải là một lệnh riêng biệt với trang man của riêng nó. Bạn sẽ cần phải đọc bash(1)trang man hoặc chạy help compgenbashdòng lệnh.
camh

Bằng cách mở rộng, làm compgen -c | sort | uniq | lesssẽ in tất cả các lệnh có sẵn mà không cần các dòng trùng lặp và được sắp xếp theo thứ tự abc.
Fabián

39

Thêm vào .bashrc

function ListAllCommands
{
    echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n' | sort -u
}

Nếu bạn cũng muốn bí danh, thì:

function ListAllCommands
{
    COMMANDS=`echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 \
        -executable -type f -printf '%P\n'`
    ALIASES=`alias | cut -d '=' -f 1`
    echo "$COMMANDS"$'\n'"$ALIASES" | sort -u
}

Điều này rất gần nhưng nó không bao gồm bí danh. Làm thế nào tôi có thể nối thêm bí danh | cắt -f1 để kết quả nhưng trước khi sắp xếp?
ack

1
Tại sao phải sắp xếp nếu mục đích duy nhất là đưa đầu ra qua grep? Triết lý của Unix là tạo ra các công cụ đơn giản và sau đó xâu chuỗi chúng lại với nhau nếu được yêu cầu, vì vậy hãy loại bỏ ListAllCommands và nếu người dùng muốn đầu ra được sắp xếp, họ có thể làm điều đó.
danio

4
Các loại là để loại bỏ trùng lặp.
Kiến Aasma

1
Điều này không tìm thấy các lệnh là liên kết tượng trưng để thực thi. Sử dụng tùy chọn -Ltrên để theo liên kết tượng trưng đến đích của họ. Lưu ý: -Llà một tùy chọn và không phải là một phần của biểu thức khớp, vì vậy nó phải được đặt trước đường dẫn trên dòng lệnh. Trong trường hợp nàyfind -L {}
Adaephon

1
Có thể muốn chuyển hướng STDERR sang / dev / null để chặn các cảnh báo thư mục không tồn tại. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 cho khả năng tương thích zsh)
TheLonelyGhost

27

type -a mycommand

lệnh liệt kê tất cả các bí danh và các lệnh trong $ PATH nơi sử dụng mycommand . Có thể được sử dụng để kiểm tra nếu lệnh tồn tại trong một số biến thể. Khác với điều đó ... Có lẽ có một số tập lệnh xung quanh phân tích $ PATH và tất cả các bí danh, nhưng không biết về bất kỳ tập lệnh nào như vậy.


1
Ngay cả khi nó không phải là một câu trả lời cho câu hỏi tôi nghĩ đó là một giải pháp tốt hơn cho vấn đề thì hãy gọi đến grep. Vì vậy, bạn có thể gõ -a foo và nếu foo không có sẵn, nó sẽ trả về lệnh không tìm thấy hoặc đại loại như thế. Vì vậy, bạn có thể kiểm tra một lệnh mà không cần gọi chính lệnh đó.
Janusz

1
Trên thực tế, đây là một câu trả lời cho câu hỏi, vì OP đã hỏi "Tôi muốn chạy phần sau và xem nếu có lệnh", vì vậy mục đích là để xem lệnh có khả dụng hay không và câu trả lời này hoạt động rõ ràng.
lothar

2
@lothar, điều gì sẽ xảy ra nếu lệnh bạn đang tìm kiếm là, uh, đó là gì, "startederver"?, "serverstart"?, "server-Something-or-other"?. Tôi biết, tôi sẽ chỉ "grep -i" cho máy chủ và xem nó có ở đó không. Giáo sư. Bzzz, không phải với giải pháp này. matey :-) Tôi sẽ không bỏ phiếu trả lời này (vì nó hữu ích ngay cả trong một cách hạn chế) nhưng một giải pháp toàn diện sẽ tính đến việc grep dành cho các biểu thức thông thường , không chỉ các chuỗi cố định.
paxdiablo

6

Sử dụng "mà searchstr". Trả về đường dẫn của thiết lập nhị phân hoặc bí danh nếu đó là bí danh

Chỉnh sửa: Nếu bạn đang tìm kiếm một danh sách các bí danh, bạn có thể sử dụng:

alias -p | cut -d= -f1 | cut -d' ' -f2

Thêm vào đó bất cứ câu trả lời tìm kiếm PATH nào bạn thích. Giả sử bạn đang sử dụng bash ..


6

Lệnh khác không hoạt động đối với tôi trên các hệ thống nhúng, vì chúng yêu cầu bash hoặc phiên bản hoàn chỉnh hơn của xargs (busybox bị giới hạn).

Các lệnh sau sẽ hoạt động trên mọi hệ thống giống Unix.

Danh sách theo thư mục:

ls $(echo $PATH | tr ':' ' ')

Liệt kê tất cả các lệnh theo tên

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort

Điều này vẫn dựa vào tr. Tại sao không đơn giản ls $(echo ${PATH//:/ })?
mschilli

5

Hãy thử kịch bản này:

#!/bin/bash
echo $PATH  | tr : '\n' | 
while read e; do 
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then     
            echo $i
        fi
    done
done

Đây là giải pháp mã duy nhất cho đến nay thực hiện nó cho tất cả các lệnh, không chỉ để xem liệu một lệnh đã biết có tồn tại hay không. +1.
paxdiablo

3

Đối với người dùng Mac ( tìm không có -executable và xargs không có -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'

Cảm ơn vì điều đó. Tôi thực sự đang sử dụng một unix mac mà câu trả lời @AntsAasma không hoạt động. Điều này làm việc cho tôi trên mac và unix của tôi quá. Tôi có thể nhập lệnh nào để xác định phiên bản unix tôi đang sử dụng, vì vậy tôi có thể trả lời ở đây để giúp người khác giải quyết vấn đề của mình không?
lăng trụ

Linux <Corporate_propri tiền_build_info_here> Thứ hai ngày 12 tháng 12 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Thật hữu ích khi liệt kê các lệnh dựa trên các từ khóa được liên kết với lệnh.

Sử dụng: man -k "your keyword"

thoải mái kết hợp với:| grep "another word"

ví dụ: để tìm một trình soạn thảo văn bản: man -k editor | grep text


2

Hãy thử nhấn ALT-? (alt và dấu hỏi cùng một lúc). Cung cấp cho nó một hoặc hai để xây dựng danh sách. Nó sẽ làm việc trong bash.


3
Hoặc thử nhấn Esc khi bắt đầu một dòng trống bốn lần.
ephemient

Điều đó thật hữu ích và tôi đã không biết điều đó nhờ :-)
Chris Huang-Leaver

2

Đây là một giải pháp cung cấp cho bạn một danh sách tất cả các tệp thực thi bí danh. Nó cũng có thể di động tới các hệ thống không có xargs -d(ví dụ Mac OS X) và xử lý đúng các đường dẫn có khoảng trắng trong đó.

#!/bin/bash
(echo -n $PATH | tr : '\0' | xargs -0 -n 1 ls; alias | sed 's/alias \([^=]*\)=.*/\1/') | sort -u | grep "$@"

Cách sử dụng : myscript.sh [grep-options] pattern, ví dụ: để tìm tất cả các lệnh bắt đầu bằng ls, không phân biệt chữ hoa chữ thường, làm:

myscript -i ^ls

2

phương pháp phím tắt để liệt kê ra tất cả các lệnh. Mở terminal và nhấn hai lần nút "tab" . Đó là hiển thị tất cả các lệnh trong thiết bị đầu cuối


1
Và bạn ống mà grepchính xác như thế nào?
Toby Speight

2

Ngoài ra, bạn có thể nhận được một danh sách các lệnh thuận tiện cùng với các mô tả nhanh (miễn là lệnh có trang man, hầu hết đều làm như vậy):

apropos -s 1 ''

-s 1 returns only "section 1" manpages which are entries for executable programs.

'' is a search for anything. (If you use an asterisk, on my system, bash throws in a search for all the files and folders in your current working directory.)

Sau đó, bạn chỉ cần grep nó như bạn muốn.

apropos -s 1 '' | grep xdg

sản lượng:

xdg-desktop-icon (1) - command line tool for (un)installing icons to the desktop
xdg-desktop-menu (1) - command line tool for (un)installing desktop menu items
xdg-email (1)        - command line tool for sending mail using the user's preferred e-mail composer
xdg-icon-resource (1) - command line tool for (un)installing icon resources
xdg-mime (1)         - command line tool for querying information about file type handling and adding descriptions for new file types
xdg-open (1)         - opens a file or URL in the user's preferred application
xdg-screensaver (1)  - command line tool for controlling the screensaver
xdg-settings (1)     - get various settings from the desktop environment
xdg-user-dir (1)     - Find an XDG user dir
xdg-user-dirs-update (1) - Update XDG user dir configuration

Các kết quả dường như không được sắp xếp, vì vậy nếu bạn đang tìm kiếm một danh sách dài, bạn có thể ném một | sắp xếp | vào giữa, và sau đó dẫn đến một máy nhắn tin như ít / nhiều hơn / nhiều nhất. ala:

apropos -s 1 '' | sort | grep zip | less

Trả về một danh sách được sắp xếp của tất cả các lệnh có "zip" trong tên của chúng hoặc mô tả ngắn của chúng và bơm máy nhắn tin "ít" hơn. (Bạn cũng có thể thay thế "ít hơn" bằng $ PAGER và sử dụng máy nhắn tin mặc định.)


1

Bạn luôn có thể làm như sau:

1. Hold the $PATH environment variable value.
2. Split by ":"
3. For earch entry: 
    ls * $entry 
4. grep your command in that output.

Shell sẽ thực thi lệnh chỉ khi chúng được liệt kê trong đường dẫn env var.


1

điều đó phụ thuộc, điều đó có nghĩa là nó phụ thuộc vào loại vỏ bạn đang sử dụng. Dưới đây là những hạn chế tôi thấy:

  1. phải chạy trong cùng tiến trình với trình bao của bạn, để bắt các bí danh và các hàm và biến có thể ảnh hưởng đến các lệnh bạn có thể tìm thấy, hãy nghĩ PATH hoặc EDITOR mặc dù EDITOR có thể nằm ngoài phạm vi. Bạn có thể có các biến không quan tâm có thể ảnh hưởng đến mọi thứ.
  2. nó là shell cụ thể hoặc bạn đi vào kernel, / Proc / pid / enviorn và bạn bè không có đủ thông tin

Tôi sử dụng ZSH nên đây là câu trả lời zsh, nó thực hiện 3 điều sau:

  1. con đường bãi
  2. bãi bỏ tên bí danh
  3. bỏ các chức năng trong env
  4. sắp xếp chúng

đây là:

feed_me() {
    (alias | cut -f1 -d= ; hash -f; hash -v | cut -f 1 -d= ; typeset +f) | sort
}

Nếu bạn sử dụng zsh điều này nên làm điều đó.


0

Vấn đề là việc hoàn thành tab đang tìm kiếm đường dẫn của bạn, nhưng tất cả các lệnh không nằm trong đường dẫn của bạn.

Để tìm các lệnh trong đường dẫn của bạn bằng cách sử dụng bash, bạn có thể làm một cái gì đó như:

cho x trong echo $PATH | cut -d":" -f1; làm ls $ x; làm xong


0

Đây là một chức năng bạn có thể đặt trong tệp bashrc của mình:

chức năng tìm kiếm lệnh
{
   oldIFS = $ {IFS}
   IFS = ":"

   cho p trong $ {PATH}
   làm
      $ p | grep $ 1
   làm xong

   xuất IFS = $ {oldIFS}
}

Ví dụ sử dụng:

$ gnome tìm kiếm lệnh
gnome-audio-profile-property *
gnome-đẩy @
khóa gnome *
gnome-keyring-daemon *
gnome-mount *
gnome-mở *
máy ghi âm gnome *
gnome-text-Editor @
gnome-umount @
kiểm soát khối lượng gnome *
polkit-gnome-ủy quyền *
vim.gnome *
$

FYI: IFS là một biến mà bash sử dụng để phân tách chuỗi.

Chắc chắn có thể có một số cách tốt hơn để làm điều này.


-1

có thể tôi đang hiểu lầm nhưng nếu bạn nhấn Escape cho đến khi bạn có khả năng Display All X thì sao?


-2
compgen -c > list.txt && wc list.txt

1
Xem xét thêm một mô tả ngắn gọn về những gì nó làm hoặc làm thế nào được cho là hoạt động. Ít nhất, chỉ định một liên kết tham chiếu (thường là trang hướng dẫn có liên quan) để theo dõi và hiểu giải pháp được đề xuất.
TheCodeArtist

Sử dụng một tập tin không phải lúc nào cũng là một lựa chọn tốt. Nếu bạn cần, thì ít nhất hãy biến nó thành một tệp tmp (nếu bảo mật không phải là vấn đề.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

Tại sao bạn không gõ:

seachstr

Trong nhà ga.

Vỏ sẽ nói một số như

seacrhstr: command not found 

BIÊN TẬP:

Ok, tôi lấy downvote, vì câu trả lời là ngu ngốc, tôi chỉ muốn biết: Câu trả lời này có gì sai !!! Người hỏi nói:

và xem nếu một lệnh có sẵn.

Nhập lệnh sẽ cho bạn biết nếu nó khả dụng!.

Có lẽ anh / cô ấy có nghĩa là "với hiện thực hiện lệnh" hoặc "bao gồm nó trong một kịch bản" nhưng tôi không thể đọc được suy nghĩ của mình (không phải là tôi không thể thường xuyên nó chỉ là anh ấy mặc một chiếc lệch tâm đọc )


4
Tôi muốn biết liệu formathddlệnh có tồn tại. Oh chờ đã, tôi chỉ để chạy nó và xem. trời ạ Cảm ơn :)
Jeffrey Jose

5
Có lẽ an toàn hơn để sử dụng 'mà' để làm điều đó.
danio

Cho rằng đây là Stack Overflow , không phải Super User , một câu trả lời theo chương trình sẽ phù hợp hơn.
Toby Speight

-5

trong debian: ls / bin / | grep "whatImSearchingFor"


1
thực thi tồn tại trong tất cả các thư mục trong $ PATH, không chỉ / bin.
PhrkOnLsh
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.