Linux-Befehl zum Auflisten aller verfügbaren Befehle und Aliase


280

Gibt es einen Linux-Befehl, der alle verfügbaren Befehle und Aliase für diese Terminalsitzung auflistet?

Als ob Sie 'a' eingegeben und die Tabulatortaste gedrückt hätten, aber für jeden Buchstaben des Alphabets. Oder 'Alias' ausführen, aber auch Befehle zurückgeben.

Warum? Ich möchte Folgendes ausführen und prüfen, ob ein Befehl verfügbar ist:

ListAllCommands | grep searchstr

Drücken Sie die TAB-Taste zweimal, um alle Befehle
aufzulisten, die in der

Antworten:


599

Sie können die integrierte Bash (1) verwenden compgen

  • compgen -c listet alle Befehle auf, die Sie ausführen können.
  • compgen -a listet alle Aliase auf, die Sie ausführen können.
  • compgen -b listet alle integrierten Funktionen auf, die Sie ausführen können.
  • compgen -k listet alle Schlüsselwörter auf, die Sie ausführen könnten.
  • compgen -A function listet alle Funktionen auf, die Sie ausführen können.
  • compgen -A function -abck listet alle oben genannten auf einmal auf.

Überprüfen Sie die Manpage auf andere Vervollständigungen, die Sie generieren können.

So beantworten Sie Ihre Frage direkt:

compgen -ac | grep searchstr

sollte tun, was du willst.


1
Gibt es ein Äquivalent dazu für csh / tcsh? Diese Terminals verfügen auch über eine Art Autocompleting-Funktion, die auf der Registerkarte verwendet wird. Gibt es also möglicherweise etwas?
krb686

2
Stattdessen compgen | grepkann es effizienter sein, die Zeichenfolge als Argument an sich compgenselbst zu übergeben (wenn bekannt ist, dass es sich um ein Präfix handelt, wie in der Frage impliziert). In diesem Fall wäre das compgen -ac searchstr.
Toby Speight

Tatsächlich zeigt Ubuntu "nichts Passendes" an whatis compgenund "Keine manuelle Eingabe" für man compgen.
MarAvFe

1
@MarAvFe: Das liegt daran, dass es sich um einen bashintegrierten Befehl handelt, nicht um einen separaten Befehl mit einer eigenen Manpage. Sie müssen die bash(1)Manpage lesen oder help compgenüber eine bashBefehlszeile ausführen .
Camh

Wenn Sie dies tun, compgen -c | sort | uniq | lesswerden alle verfügbaren Befehle ohne doppelte Zeilen gedruckt und alphabetisch sortiert.
Fabián

39

Zu .bashrc hinzufügen

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

Wenn Sie auch Aliase möchten, dann:

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
}

Dies ist sehr eng, enthält jedoch keine Aliase. Wie kann ich einen Alias ​​anhängen? -f1 auf die Ergebnisse schneiden, aber vor der Sortierung?
Bestätigen Sie den

1
Warum sortieren, wenn der einzige Zweck darin besteht, die Ausgabe trotzdem über grep zu übertragen? Die Unix-Philosophie besteht darin, einfache Tools zu erstellen und diese bei Bedarf miteinander zu verketten. Lassen Sie also die Sortierung in ListAllCommands weg, und wenn der Benutzer die Ausgabe sortieren möchte, kann er dies tun.
Danio

4
Die Sortierung besteht darin, Duplikate zu entfernen.
Ameisen Aasma

1
Dies findet keine Befehle, die Symlinks zu ausführbaren Dateien sind. Verwenden Sie die Option -Lein, um Symlinks zu ihrem Ziel zu folgen. Hinweis: -List eine Option und nicht Teil des übereinstimmenden Ausdrucks. Daher muss er vor dem Pfad in der Befehlszeile platziert werden. In diesem Fallfind -L {}
Adaephon

1
Möglicherweise möchten Sie STDERR nach / dev / null umleiten, um nicht vorhandene Verzeichniswarnungen zu unterdrücken. echo -n $PATH | xargs -d : -I {} find {} -maxdepth 1 -executable -type f -printf '%P\n' 2> /dev/null | sort -u(+1 für zsh Kompatibilität)
TheLonelyGhost

27

Dort ist der

type -a mycommand

Befehl, der alle Aliase und Befehle in $ PATH auflistet, in denen mycommand verwendet wird. Kann verwendet werden, um zu überprüfen, ob der Befehl in mehreren Varianten vorhanden ist. Davon abgesehen ... Es gibt wahrscheinlich ein Skript, das $ PATH und alle Aliase analysiert, aber nichts über ein solches Skript weiß.


1
Auch wenn es keine Antwort auf die Frage ist, denke ich, dass es eine bessere Lösung für das Problem ist als der Aufruf von grep. Sie können also -a foo eingeben, und wenn foo nicht verfügbar ist, wird der Befehl nicht gefunden oder ähnliches zurückgegeben. So können Sie nach einem Befehl suchen, ohne den Befehl selbst aufzurufen.
Janusz

1
Tatsächlich handelt es sich um eine Antwort auf die Frage, da das OP gefragt hat: "Ich möchte Folgendes ausführen und prüfen, ob ein Befehl verfügbar ist". Der Zweck besteht also darin, festzustellen, ob ein Befehl verfügbar ist und diese Antwort eindeutig funktioniert.
Lothar

2
@lothar, was ist, wenn der gesuchte Befehl "Startserver", "Serverstart", "Server-etwas-oder-anderes" ist? Ich weiß, ich werde nur "grep -i" für den Server und sehen, ob es da ist. Hoppla. Bzzz, nicht mit dieser Lösung. matey :-) Ich werde diese Antwort nicht ablehnen (da sie auch in begrenztem Umfang nützlich ist), aber eine vollständige Lösung würde berücksichtigen, dass grep für reguläre Ausdrücke und nicht nur für feste Zeichenfolgen gilt.
Paxdiablo

6

Verwenden Sie "which searchstr". Gibt entweder den Pfad der Binärdatei oder das Alias-Setup zurück, wenn es sich um einen Alias ​​handelt

Bearbeiten: Wenn Sie nach einer Liste von Aliasnamen suchen, können Sie Folgendes verwenden:

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

Fügen Sie dies zu der gewünschten PATH-Suchantwort hinzu. Angenommen, Sie verwenden Bash.


6

Der Befehl "Andere" funktionierte auf eingebetteten Systemen nicht für mich, da sie Bash oder eine vollständigere Version von xargs erfordern (Busybox war begrenzt).

Die folgenden Befehle sollten auf jedem Unix-ähnlichen System funktionieren.

Liste nach Ordner:

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

Listen Sie alle Befehle nach Namen auf

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

Dies hängt immer noch davon ab tr. Warum nicht einfach ls $(echo ${PATH//:/ })?
Mschilli

5

Versuchen Sie dieses Skript:

#!/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

Dies ist die einzige Codelösung, die dies für alle Befehle tut, nicht nur um festzustellen, ob ein bestimmter bekannter Befehl vorhanden ist. +1.
Paxdiablo

3

Für Mac-Benutzer ( find hat nicht -executable und xargs hat -d nicht):

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

Danke dafür. Ich verwende tatsächlich ein Nicht-Mac-Unix, bei dem die Antwort von @AntsAasma nicht funktioniert hat. Dies funktioniert für mich auf Mac und meinem Unix auch. Welchen Befehl kann ich eingeben, um die Unix-Version zu bestimmen, auf der ich mich befinde, damit ich hier antworten kann, um anderen bei meinem Problem zu helfen?
Prismaticorb

Linux <corporate_proprietary_build_info_here> Mon Dec 12 13:34:16 EST 2011 x86_64 x86_64 x86_64 GNU / Linux
prismaticorb

3

Es ist nützlich, die Befehle basierend auf den dem Befehl zugeordneten Schlüsselwörtern aufzulisten.

Verwenden: man -k "your keyword"

Fühlen Sie sich frei zu kombinieren mit:| grep "another word"

So finden Sie beispielsweise einen Texteditor: man -k editor | grep text


2

Versuchen Sie ALT- zu drücken? (Alt und Fragezeichen gleichzeitig). Geben Sie ein oder zwei Sekunden Zeit, um die Liste zu erstellen. Es sollte in Bash funktionieren.


3
Oder versuchen Sie viermal, Esc am Anfang einer leeren Zeile zu drücken.
Ephemient

Das ist unglaublich nützlich und ich wusste es noch nicht, danke :-)
Chris Huang-Leaver

2

Hier ist eine Lösung, die Ihnen eine Liste aller ausführbaren Dateien und Aliase gibt. Es ist auch auf Systeme ohne xargs -d(z. B. Mac OS X) portierbar und verarbeitet Pfade mit Leerzeichen ordnungsgemäß.

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

Verwendung: Um myscript.sh [grep-options] patternz. B. alle Befehle zu finden, die mit lsGroß- und Kleinschreibung beginnen, tun Sie Folgendes:

myscript -i ^ls

2

Verknüpfungsmethode zum Auflisten aller Befehle. Öffnen Sie das Terminal und drücken Sie zweimal die Tabulatortaste . Das zeigt alle Befehle im Terminal


1
Und Sie leiten das grepgenau in wie?
Toby Speight

2

Alternativ können Sie eine praktische Liste von Befehlen zusammen mit Kurzbeschreibungen erhalten (sofern der Befehl über eine Manpage verfügt, was die meisten tun):

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

Dann grepst du es einfach so, wie du willst.

apropos -s 1 '' | grep xdg

Ausbeuten:

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

Die Ergebnisse scheinen nicht sortiert zu sein. Wenn Sie also nach einer langen Liste suchen, können Sie ein | werfen sortieren | in die Mitte, und leiten Sie das dann zu einem Pager wie weniger / mehr / am meisten. ala:

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

Dies gibt eine sortierte Liste aller Befehle zurück, deren Name oder Kurzbeschreibung "zip" enthält, und pumpt den "weniger" -Pager. (Sie können auch "less" durch $ PAGER ersetzen und den Standard-Pager verwenden.)


1

Sie können immer zu folgendem:

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

Die Shell führt den Befehl nur aus, wenn sie ohnehin im Pfad env var aufgeführt sind.


1

es hängt davon ab, damit meine ich, es hängt davon ab, welche Shell Sie verwenden. Hier sind die Einschränkungen, die ich sehe:

  1. muss im selben Prozess wie Ihre Shell ausgeführt werden, um Aliase und Funktionen und Variablen abzufangen, die sich auf die Befehle auswirken würden, die Sie finden können. Denken Sie an PATH oder EDITOR, obwohl EDITOR möglicherweise außerhalb des Gültigkeitsbereichs liegt. Sie können nicht exportierte Variablen haben, die Auswirkungen haben können.
  2. Es ist Shell-spezifisch oder Sie gehen in den Kernel, / proc / pid / enviorn und Freunde haben nicht genug Informationen

Ich benutze ZSH, also hier ist eine zsh-Antwort, es macht die folgenden 3 Dinge:

  1. Dumps Pfad
  2. Dumps Aliasnamen
  3. Dumps-Funktionen, die sich in der Umgebung befinden
  4. sortiert sie

hier ist es:

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

Wenn Sie zsh verwenden, sollte dies der Fall sein.


0

Das Problem ist, dass die Tab-Vervollständigung Ihren Pfad durchsucht, aber nicht alle Befehle in Ihrem Pfad enthalten sind.

Um die Befehle in Ihrem Pfad mit bash zu finden, können Sie Folgendes tun:

für x in echo $PATH | cut -d":" -f1; mache ls $ x; getan


0

Hier ist eine Funktion, die Sie in Ihre bashrc-Datei einfügen können:

Funktionsbefehlssuche
{
   oldIFS = $ {IFS}
   IFS = ":"

   für p in $ {PATH}
   tun
      ls $ p | grep $ 1
   getan

   export IFS = $ {oldIFS}
}}

Anwendungsbeispiel:

$ Befehlssuchgnom
Gnome-Audio-Profile-Eigenschaften *
gnome-eject @
Gnom-Schlüsselring *
gnome-keyring-daemon *
Gnomenmontage *
gnome-open *
Gnom-Sound-Recorder *
gnome-text-editor @
gnome-umount @
Gnome-Lautstärkeregelung *
Polkit-Gnom-Autorisierung *
vim.gnome *
$

Zu Ihrer Information: IFS ist eine Variable, mit der bash Zeichenfolgen aufteilt.

Sicherlich könnte es dafür bessere Möglichkeiten geben.


-1

Vielleicht verstehe ich das falsch, aber was ist, wenn Sie die Esc-Taste drücken, bis Sie die Möglichkeiten "Alle X anzeigen" erhalten?


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

1
Fügen Sie eine kurze Beschreibung hinzu, was dies bewirkt oder wie dies funktionieren soll. Geben Sie mindestens einen Referenzlink (normalerweise die entsprechende Manpage) an, um die vorgeschlagene Lösung zu verfolgen und zu verstehen.
TheCodeArtist

Die Verwendung einer Datei ist nicht immer eine gute Option. Wenn Sie müssen, dann machen Sie es zumindest eine tmp-Datei (wenn Sicherheit kein Problem ist.)compgen -c > /tmp/list.txt && /tmp/wc list.txt
Gary

-3

Warum tippst du nicht einfach:

seachstr

Im Terminal.

Die Muschel wird so etwas sagen

seacrhstr: command not found 

BEARBEITEN:

Ok, ich nehme die Ablehnung, weil die Antwort dumm ist, ich möchte nur wissen: Was ist los mit dieser Antwort !!! Der Fragesteller sagte:

und prüfen Sie, ob ein Befehl verfügbar ist.

Wenn Sie den Befehl eingeben, erfahren Sie, ob er verfügbar ist!.

Wahrscheinlich meinte er / sie "ohne den Befehl auszuführen" oder "ihn in ein Skript aufzunehmen", aber ich kann seine Gedanken nicht lesen (ist nicht, dass ich nicht regelmäßig kann, es ist nur so, dass er einen Gedankenlesedeflektor trägt )


4
Ich möchte wissen, ob ein formathddBefehl existiert. Oh warte, ich will es nur laufen lassen und sehen. gee. Danke :)
Jeffrey Jose

5
Wahrscheinlich sicherer, "was" zu verwenden, um das zu tun.
Danio

Da dies ein Stapelüberlauf und kein Superuser ist , wäre eine programmatische Antwort angemessener.
Toby Speight

-5

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


1
Ausführbare Dateien sind in allen Verzeichnissen in $ PATH vorhanden, nicht nur in / bin.
PhrkOnLsh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.