Listet alle Befehle auf, die eine Shell kennt

32

Was kann ich an meiner Shell basheingeben (was zufällig ist ), das alle erkannten Befehle auflistet?

Auch unterscheidet sich dies durch Shell? Oder haben alle Shells nur ein "Verzeichnis" von Befehlen, die sie erkennen?

Zweitens eine andere Frage, aber wie kann ich eine davon außer Kraft setzen? Mit anderen Worten , wie kann ich meinen eigenen schreiben viewBefehl ersetzen auf meinem Ubuntu - System vorhandene, die nur Last erscheint vim.

der Spiegel
quelle
5
Bitte kombinieren Sie keine Fragen. Stellen Sie jede Frage als separate Frage.
terdon
Fast Duplikat von unix.stackexchange.com/q/63073/135943 (Ich habe in beide Richtungen verlinkt.)
Wildcard

Antworten:

61

Sie können verwendencompgen

compgen -c # will list all the commands you could run.

Zu Ihrer Information:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.
Rahul Patil
quelle
4
Beachten Sie, dass compgen -cDinge wie {oder whilenicht genau genommen Befehle enthalten.
Stéphane Chazelas
13

Eine Shell kennt vier Arten von Befehlen.

  • Aliase: Dies sind Kurznamen für einen Befehl mit einigen Optionen. Sie sind in der Initialisierungsdatei der Shell definiert ( ~/.bashrcfür Bash).
  • Funktionen: Sie sind Ausschnitte aus dem Shell-Code, denen ein Name gegeben wurde. Wie Aliase werden sie in der Initialisierungsdatei der Shell definiert.
  • Builtins: Die Shell wird mit einer kleinen Anzahl eingebauter Befehle ausgeliefert. Die meisten Builtins manipulieren den Shell-Status ( cdändert das aktuelle Verzeichnis, setändert Optionen und Positionsparameter, exportändert die Umgebung, ...). Die meisten Shells bieten im Wesentlichen die gleichen Buildins, aber jede Shell verfügt über einige Erweiterungen zum Basissatz.
  • Externe Befehle: Sie sind unabhängig von der Shell. Wie andere Programme führt die Shell externe Programme aus, indem sie sie im ausführbaren Suchpfad nachschlägt . Die PATHUmgebungsvariable enthält eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach Programmen gesucht werden soll.

Falls es mehrere gleichnamige Befehle gibt, wird die erste Übereinstimmung in der obigen Reihenfolge ausgeführt¹.

Sie können sehen, welcher Art von Befehl ein Name entspricht, indem Sie ausführen type some_name.

Sie können Aliase auflisten, indem Sie das aliasintegrierte ohne Argument ausführen. Es gibt keine Möglichkeit, Funktionen oder integrierte Funktionen aufzulisten, die in allen Shells funktionieren. Eine Liste der eingebauten Funktionen finden Sie in der Dokumentation der Shell.

In bash setlistet das Builtin Funktionen mit ihren Definitionen sowie Variablen auf. typeset -fListet in bash, ksh oder zsh Funktionen mit ihren Definitionen auf. In bash können Sie alle Befehlsnamen eines beliebigen Typs mit auflisten compgen -c. Sie können verwendet werden compgen -A alias, compgen -A builtin compgen -A functionum die Liste Befehle eines bestimmten Typs. Sie können eine zusätzliche Zeichenfolge übergeben, compgenum nur Befehle aufzulisten, die mit diesem Präfix beginnen.

In zsh, können Sie die aktuell verfügbaren Befehle eines bestimmten Typs mit aufzulisten echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}und echo ${(k)commands}(dem letzten List externen Befehlen nur).

Das folgende Shell-Agnostic-Snippet listet alle verfügbaren externen Programme auf:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

In Bash: Hash-Befehlen gibt es einen Randfall.

Das Bash-Referenzhandbuch sagt:

Eine vollständige Suche in den Verzeichnissen in $ PATH wird nur durchgeführt, wenn der Befehl nicht in der Hash-Tabelle gefunden wird

Versuchen:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

Die PATHUmgebungsvariable enthält nicht ~/dir-for-wat-command, compgen -cwird nicht angezeigt wat, aber Sie können ausführen wat.

Wenn Sie einen vorhandenen Befehl spiegeln möchten, definieren Sie einen Alias ​​oder eine Funktion .

¹ Ausnahme: Einige Buildins (sogenannte Special Buildins ) können nicht von einer Funktion gespiegelt werden - bash und zsh stimmen jedoch in diesem Punkt im Standardmodus nicht mit POSIX überein .

Gilles 'SO - hör auf böse zu sein'
quelle
Ein weiterer Randfall ist für Werte $PATHwie /bin:/usr/bin:(nachgestellt :), bei denen die ausführbaren Dateien im aktuellen Verzeichnis nicht aufgelistet werden.
Stéphane Chazelas
3

Die Befehlsliste besteht aus zwei Mengen:

  1. Die in die Shell integrierten Befehle
  2. Die Befehle in Ihrem PATH

Sie können die integrierten Funktionen nicht ändern, aber Sie können verhindern, dass die Shell eine integrierte Funktion verwendet, indem Sie den vollständigen Pfadnamen wie angeben /bin/echo.

Was die Befehle in Ihrem PATH, Sie können das ändern. PATHist eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach Befehlen gesucht werden soll. Die erste gefundene übereinstimmende Datei "wins".

export PATH=~/bin:${PATH}

(Diese Syntax funktioniert nicht für cshabgeleitete Shells, sondern für alle anderen, die ich kenne.)

Das exportiert PATHmit ~/binals erstem Eintrag, gefolgt von dem Rest der vorhandenen PATHEinträge. Jetzt überprüft Ihre Shell directory calledbin in your home directory for a command *first* before checking the standardPATH`, die das System eingerichtet hat. Sie können das neue Verzeichnis auch als letztes überprüfen lassen, indem Sie stattdessen Folgendes verwenden:

export PATH=${PATH}:~/bin

Um die PATHbestehen bleiben für zukünftige Anmeldungen, fügen Sie ihn in eine .profileoder andere Shell rc - Datei.

Kurtm
quelle
2

Versuchen Sie dies mit :

printf '%s\n' ${PATH//:/\/* }
Gilles Quenot
quelle
1

Wenn Sie zweimal die Tabulatortaste und dann y drücken, wird die Liste aller verfügbaren Befehle in Ihrer aktuellen Shell angezeigt. Für die zweite Frage sollten Sie einen Alias ​​verwenden: Shell-Alias .

Kaffeebecher
quelle
Ist dies in Bezug auf Alias ​​eine idiotensichere Methode zum Überschreiben und Nichtüberschreiben (durch "Unaliasing") eines Befehls, wenn dieser an einer beliebigen Stelle im System aufgerufen wird (z. B. aus einem Shell-Skript)?
themirror
1
Welche Shell benutzt du? Ich kann nicht mit der doppelten Registerkarte alle Befehle in meiner Bash auflisten.
terdon
Ich benutze Bash auf Ubuntu 13.04. Es gibt auch einen Befehl namens compgen, mit dem die Liste aller verfügbaren Befehle in der Bash abgerufen werden kann.
coffeMug
@terdon Haben Sie die Bash-Vervollständigung installiert?
coffeMug
1
set show-all-if-ambiguous off
coffeMug