Polecenie Linux, aby wyświetlić listę wszystkich dostępnych poleceń i aliasów

280

Czy istnieje polecenie systemu Linux, które wyświetla listę wszystkich dostępnych poleceń i aliasów dla tej sesji terminala?

Jakby wpisałeś „a” i nacisnąłeś tab, ale dla każdej litery alfabetu. Lub uruchamianie „aliasu”, ale także zwracanie poleceń.

Czemu? Chciałbym uruchomić następujące i sprawdzić, czy polecenie jest dostępne:

ListAllCommands | grep searchstr
ack
źródło
naciśnij dwukrotnie klawisz TAB, aby wyświetlić listę wszystkich poleceń dostępnych w środowisku
ntshetty

Odpowiedzi:

599

Możesz użyć wbudowanego bash (1) compgen

  • compgen -c wyświetli listę wszystkich poleceń, które możesz uruchomić.
  • compgen -a wyświetli listę wszystkich aliasów, które możesz uruchomić.
  • compgen -b wyświetli listę wszystkich wbudowanych programów, które możesz uruchomić.
  • compgen -k wyświetli listę wszystkich słów kluczowych, które możesz uruchomić.
  • compgen -A function wyświetli listę wszystkich funkcji, które możesz uruchomić.
  • compgen -A function -abck wypisze wszystkie powyższe za jednym razem.

Sprawdź stronę podręcznika pod kątem innych uzupełnień, które możesz wygenerować.

Aby bezpośrednio odpowiedzieć na twoje pytanie:

compgen -ac | grep searchstr

powinien robić, co chcesz.

camh
źródło
1
Czy istnieje odpowiednik tego dla csh / tcsh? Te terminale mają również jakąś funkcję autouzupełniania używaną na karcie, więc może coś istnieje?
krb686
2
Zamiast tego compgen | grepbardziej efektywne może być przekazanie łańcucha jako argumentu do compgensiebie (jeśli wiadomo, że jest to przedrostek, jak sugeruje to pytanie). W tym przypadku tak by było compgen -ac searchstr.
Toby Speight
W rzeczywistości Ubuntu pokazuje „nic odpowiedniego” whatis compgeni „Brak ręcznego wprowadzania” dla man compgen.
MarAvFe
1
@MarAvFe: To dlatego, że jest to bashwbudowane, a nie osobne polecenie z własną stroną podręcznika . Musisz przeczytać bash(1)stronę podręcznika lub uruchomić help compgenw bashlinii poleceń.
camh
Według rozszerzenia, do compgen -c | sort | uniq | lesswypisze wszystkie dostępne polecenia bez powielonych linii i posortowane alfabetycznie.
Fabián
39

Dodaj do .bashrc

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

Jeśli chcesz także mieć aliasy, to:

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
}
Mrówka osocza
źródło
Jest to bardzo blisko, ale nie obejmuje pseudonimów. Jak mogę dołączyć alias | wyciąć -f1 z wynikami, ale przed sortowaniem?
ack
1
Po co zawracać sobie głowę sortowaniem, jeśli jedynym celem jest mimo wszystko przetworzenie wyniku przez grep? Filozofią Uniksa jest tworzenie prostych narzędzi, a następnie łączenie ich w razie potrzeby, więc zostaw sortowanie poza ListAllCommands, a jeśli użytkownik chce posortować dane wyjściowe, może to zrobić.
danio
4
Sortowanie polega na usuwaniu duplikatów.
Ants Aasma
1
Nie znajduje to poleceń będących dowiązaniami symbolicznymi do plików wykonywalnych. Użyj opcji -Lon, aby podążać za dowiązaniami symbolicznymi do miejsca docelowego. Uwaga: -Ljest opcją, a nie częścią pasującego wyrażenia, dlatego należy ją umieścić przed ścieżką w wierszu polecenia. W tym przypadkufind -L {}
Adaephon
1
Może chcesz przekierować STDERR do / dev / null, aby ukryć nieistniejące ostrzeżenia o katalogu. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 za zgodność z zsh)
TheLonelyGhost
27

Jest

type -a mycommand

polecenie, które wyświetla wszystkie aliasy i polecenia w $ PATH, gdzie używana jest moja komenda . Można go użyć do sprawdzenia, czy polecenie istnieje w kilku wariantach. Poza tym ... Prawdopodobnie jest jakiś skrypt, który analizuje $ PATH i wszystkie aliasy, ale nie wiem o żadnym takim skrypcie.

słoneczny256
źródło
1
Nawet jeśli nie jest to odpowiedź na pytanie, myślę, że jest to lepsze rozwiązanie problemu, niż wezwanie do grep. Możesz więc wpisać -a foo, a jeśli foo nie jest dostępne, zwraca polecenie nie znalezione lub coś takiego. Możesz więc sprawdzić polecenie bez wywoływania samego polecenia.
Janusz
1
W rzeczywistości jest to odpowiedź na pytanie, ponieważ OP zapytał: „Chciałbym uruchomić następujące i sprawdzić, czy polecenie jest dostępne”, więc celem jest sprawdzenie, czy polecenie jest dostępne i ta odpowiedź wyraźnie działa.
lothar
2
@lothar, co jeśli polecenie, którego szukasz, to: „startserver” ?, „serverstart” ?, „server-coś-lub-inny” ?. Wiem, po prostu „grep -i” dla serwera i zobaczę, czy tam jest. Ups Bzzz, nie z tym rozwiązaniem. matey :-) Nie zamierzam głosować tej odpowiedzi w dół (ponieważ jest przydatna, nawet jeśli w ograniczony sposób), ale pełne rozwiązanie wziąłoby pod uwagę, że grep jest dla wyrażeń regularnych , a nie tylko stałych ciągów.
paxdiablo
6

Użyj „which searchstr”. Zwraca ścieżkę konfiguracji binarnej lub aliasu, jeśli jest to alias

Edycja: jeśli szukasz listy aliasów, możesz użyć:

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

Dodaj to do dowolnej odpowiedzi PATH, która Ci odpowiada. Zakłada, że ​​używasz bash ..

Aaron
źródło
6

Polecenie inne nie działało dla mnie w systemach osadzonych, ponieważ wymagają bash lub bardziej kompletnej wersji xargs (busybox był ograniczony).

Poniższe polecenia powinny działać na każdym systemie uniksopodobnym.

Lista według folderu:

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

Wyświetl wszystkie polecenia według nazwy

ls $(echo $PATH | tr ':' ' ') | grep -v '/' | grep . | sort
Olivier Lasne
źródło
To wciąż zależy tr. Dlaczego nie po prostu ls $(echo ${PATH//:/ })?
mschilli
5

Wypróbuj ten skrypt:

#!/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
Wiktor Hugo
źródło
Jest to jedyne jak dotąd rozwiązanie kodu, które robi to dla wszystkich poleceń, nie tylko po to, aby sprawdzić, czy istnieje znane znane polecenie. +1.
paxdiablo
3

Dla użytkowników komputerów Mac ( find nie ma -executable, a xargs nie ma -d):

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -perm '++x'
sklepienie
źródło
Dzięki za to. Właściwie używam uniksowego Maca, gdzie odpowiedź @AntsAasma nie działała. Działa to dla mnie na Macu i moim Uniksie. Jaką komendę mogę wpisać, aby określić wersję Unixa, na której jestem, aby móc odpowiedzieć tutaj, aby pomóc innym w rozwiązaniu mojego problemu?
prismaticorb
Linux <korporacyjna_budowa_informacyjna_tutaj> Pon.12.12 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb
3

Przydatne jest wypisanie poleceń na podstawie słów kluczowych powiązanych z poleceniem.

Posługiwać się: man -k "your keyword"

możesz połączyć z:| grep "another word"

na przykład, aby znaleźć edytor tekstu: man -k editor | grep text

Zięba
źródło
2

Spróbuj nacisnąć ALT-? (alt i znak zapytania w tym samym czasie). Daj mu sekundę lub dwie, aby zbudować listę. Powinno działać w trybie bash.

Igor Krivokon
źródło
3
Lub spróbuj uderzyć Esc cztery razy na początku pustej linii.
ephemient
Jest to niezwykle przydatne i jeszcze tego nie wiedziałem dzięki :-)
Chris Huang-Leaver
2

Oto rozwiązanie, które daje listę wszystkich plików wykonywalnych i aliasów. Jest także przenośny dla systemów bez xargs -d(np. Mac OS X) i poprawnie obsługuje ścieżki ze spacjami w nich.

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

Użycie: myscript.sh [grep-options] patternnp. Aby znaleźć wszystkie polecenia zaczynające się od ls, bez rozróżniania wielkości liter, wykonaj:

myscript -i ^ls
Adam Rosenfield
źródło
2

metoda skrótu, aby wyświetlić listę wszystkich poleceń. Otwórz terminal i naciśnij dwa razy przycisk „tab” . To pokazuje wszystkie polecenia w terminalu

denny
źródło
1
I wpakowujesz to grepdokładnie w jaki sposób?
Toby Speight
2

Możesz też uzyskać wygodną listę poleceń połączoną z szybkimi opisami (o ile polecenie ma stronę podręcznika, co większość robi):

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.)

Potem po prostu grepuj, jak chcesz.

apropos -s 1 '' | grep xdg

daje:

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

Wyniki nie wydają się być posortowane, więc jeśli szukasz długiej listy, możesz rzucić | sortuj | do środka, a następnie potokuj to do pagera, np. mniej / więcej / najbardziej. ala:

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

Która zwraca posortowaną listę wszystkich poleceń, które mają „zip” w nazwie lub ich krótki opis, i pompuje to, że „mniej” pager. (Możesz także zamienić „mniej” na $ PAGER i użyć domyślnego pagera.)

Katastic Voyage
źródło
1

Zawsze możesz wykonać następujące czynności:

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

Powłoka wykona polecenie tylko, jeśli i tak jest wymieniona w ścieżce env var.

OscarRyz
źródło
1

to zależy, to znaczy zależy od tego, jakiej powłoki używasz. oto ograniczenia, które widzę:

  1. musi działać w tym samym procesie co twoja powłoka, aby wychwycić aliasy, funkcje i zmienne, które miałyby wpływ na polecenia, które możesz znaleźć, pomyśleć ŚCIEŻKA lub EDYTOR, chociaż EDYTOR może być poza zakresem. Możesz mieć nieobsługiwane zmienne, które mogą wpływać na różne rzeczy.
  2. jest to specyficzne dla powłoki lub gdy wchodzisz do jądra, / proc / pid / enviorn i przyjaciele nie mają wystarczającej ilości informacji

Korzystam z ZSH, więc oto odpowiedź zsh, robi 3 następujące rzeczy:

  1. zrzuca ścieżkę
  2. zrzuca nazwy aliasów
  3. zrzuca funkcje, które są w env
  4. sortuje je

tutaj jest:

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

Jeśli używasz zsh, powinno to zrobić.

ms4720
źródło
0

Problem polega na tym, że uzupełnianie tabulatorów szuka twojej ścieżki, ale wszystkie polecenia nie są na twojej ścieżce.

Aby znaleźć polecenia na ścieżce za pomocą bash, możesz zrobić coś takiego:

dla x in echo $PATH | cut -d":" -f1; czy ls $ x; Gotowe

nikudesu
źródło
0

Oto funkcja, którą możesz umieścić w swoim pliku bashrc:

funkcja wyszukiwania poleceń
{
   oldIFS = $ {IFS}
   IFS = „:”

   za p w $ {ŚCIEŻKA}
   robić
      ls $ p | grep 1 $
   Gotowe

   eksport IFS = $ {oldIFS}
}

Przykładowe użycie:

$ gnome do wyszukiwania poleceń
gnome-audio-profile-właściwości *
gnome-eject @
brelok do kluczy gnome *
gnome-keyring-daemon *
gnome-mount *
gnome-open *
rejestrator dźwięku gnome *
gnome-text-editor @
gnome-umount @
regulacja głośności gnome *
autoryzacja polkit-gnome *
vim.gnome *
$

FYI: IFS jest zmienną używaną przez bash do dzielenia łańcuchów.

Z pewnością mogą istnieć lepsze sposoby na to.

Craig Wright
źródło
-1

może się mylę, ale co, jeśli naciśniesz klawisz Escape, dopóki nie pojawi się opcja Wyświetl wszystkie X?

LB40
źródło
-2
compgen -c > list.txt && wc list.txt
some1
źródło
1
Rozważ dodanie krótkiego opisu tego, co to działa lub jak to powinno działać. Przynajmniej określ link referencyjny (zwykle odpowiednią stronę podręcznika), aby śledzić i zrozumieć proponowane rozwiązanie.
TheCodeArtist
Korzystanie z pliku nie zawsze jest dobrą opcją. Jeśli potrzebujesz, to przynajmniej uczyń z niego plik tmp (jeśli bezpieczeństwo nie stanowi problemu)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary
-3

Dlaczego po prostu nie wpiszesz:

seachstr

W terminalu.

Powłoka powie coś w stylu:

seacrhstr: command not found 

EDYTOWAĆ:

Ok, biorę głos negatywny, ponieważ odpowiedź jest głupia, chcę tylko wiedzieć: co jest nie tak z tą odpowiedzią !!! Pytający powiedział:

i sprawdź, czy polecenie jest dostępne.

Wpisanie polecenia powie ci, czy jest dostępne!

Prawdopodobnie miał na myśli „bez wykonywania polecenia” lub „dołączyć go do skryptu”, ale nie mogę czytać w jego myślach (nie chodzi o to, że nie mogę regularnie, to po prostu dlatego, że ma deflektor czytający w myślach )

OscarRyz
źródło
4
Chcę wiedzieć, czy formathddpolecenie istnieje. Och, czekaj, po prostu go uruchomię i zobaczę. Ojej. Dzięki :)
Jeffrey Jose
5
Prawdopodobnie bezpieczniej jest użyć „które”, aby to zrobić.
danio,
Biorąc pod uwagę, że jest to przepełnienie stosu , a nie superużytkownik , bardziej odpowiednia byłaby odpowiedź programowa.
Toby Speight
-5

w debian: ls / bin / | grep „whatImSearchingFor”

Gabriel Sosa
źródło
1
pliki wykonywalne istnieją we wszystkich katalogach w $ PATH, nie tylko / bin.
PhrkOnLsh