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 (
~/.bashrc
fü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
PATH
Umgebungsvariable 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 alias
integrierte 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 set
listet das Builtin Funktionen mit ihren Definitionen sowie Variablen auf. typeset -f
Listet 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 function
um die Liste Befehle eines bestimmten Typs. Sie können eine zusätzliche Zeichenfolge übergeben, compgen
um 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 PATH
Umgebungsvariable enthält nicht ~/dir-for-wat-command
, compgen -c
wird 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 .