Listet alle Befehle auf, die eine Shell kennt

Listet alle Befehle auf, die eine Shell kennt

Was kann ich in meiner Shell (zufällig ist das bash) eingeben, um alle erkannten Befehle aufzulisten?

Ist das außerdem je nach Shell unterschiedlich? Oder haben alle Shells einfach ein „Verzeichnis“ mit Befehlen, die sie erkennen?

Zweitens, eine andere Frage, aber wie kann ich einen davon überschreiben? Mit anderen Worten, wie kann ich meinen eigenen viewBefehl schreiben, um den auf meinem Ubuntu-System vorhandenen zu ersetzen, der anscheinend nur lädt vim.

Antwort1

Sie könnencompgen

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.

Antwort2

Eine Shell kennt vier Arten von Befehlen.

  • Aliase: Dies sind Spitznamen für einen Befehl mit einigen Optionen. Sie werden in der Initialisierungsdatei der Shell definiert ( ~/.bashrcfür Bash).
  • Funktionen: Dabei handelt es sich um benannte Schnipsel des Shell-Codes. Wie Aliase werden sie in der Initialisierungsdatei der Shell definiert.
  • Builtins: Die Shell verfügt über eine kleine Anzahl von Builtins. Die meisten Builtins manipulieren den Shell-Zustand ( cdändern das aktuelle Verzeichnis, setändern Optionen und Positionsparameter, exportändern die Umgebung, …). Die meisten Shells bieten weitgehend dieselben Builtins, aber jede Shell hat 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 diese imausführbarer Suchpfad. Die PATHUmgebungsvariable enthält eine durch Doppelpunkte getrennte Liste von Verzeichnissen, in denen nach Programmen gesucht werden soll.

Falls Befehle mehrerer Typen mit demselben Namen vorhanden sind, wird die erste Übereinstimmung in der obigen Reihenfolge ausgeführt¹.

Sie können sehen, welchem ​​Befehlstyp ein Name entspricht, indem Sie ausführen type some_name.

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

In Bash listet das setintegrierte Element Funktionen mit ihren Definitionen sowie Variablen auf. In Bash typeset -flistet KSH oder ZSH Funktionen mit ihren Definitionen auf. In Bash können Sie alle Befehlsnamen beliebigen Typs mit auflisten compgen -c. Sie können , verwenden compgen -A alias, compgen -A builtin compgen -A functionum Befehle eines bestimmten Typs aufzulisten. Sie können eine zusätzliche Zeichenfolge an ü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 echo ${(k)aliases}, echo ${(k)functions}, echo ${(k)builtins}und auflisten echo ${(k)commands}(letzteres listet nur externe Befehle auf).

Der folgende Shell-agnostische Codeausschnitt 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

Es gibt einen Sonderfall in Bash: gehashte Befehle.

Bash-Referenzhandbuchsagt:

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-commandund compgen -czeigt nicht an 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 Builtins (sogenanntespezielle Einbauten) kann nicht von einer Funktion überschattet werden – bash und zsh sind in diesem Punkt im Standardmodus jedoch nicht POSIX-kompatibel.

Antwort3

Versuchen Sie dies mit:

(   # usage of a sub processus: the modificaion of PATH variable is local in ( )
    PATH+=:EOF # little hack to list last PATH dir
    printf '%s\n' ${PATH//:/\/* }
)

Antwort4

Wenn Sie zweimal die Tabulatortaste und dann y drücken, erhalten Sie eine Liste aller verfügbaren Befehle in Ihrer aktuellen Shell. Für die zweite Frage sollten Sie meiner Meinung nach den Alias ​​verwenden:Shell-Alias.

verwandte Informationen