Stimmt es, dass alle Befehle, die in bash ausgeführt werden können, nicht Teil von bash sind? Allmählich wird mir klar, dass ich die Shell und die Anwendungen, die darin ausgeführt werden können, verwirrt habe.
Stimmt es, dass alle Befehle, die in bash ausgeführt werden können, nicht Teil von bash sind? Allmählich wird mir klar, dass ich die Shell und die Anwendungen, die darin ausgeführt werden können, verwirrt habe.
Antworten:
Es gibt keine scharfe Grenze zwischen der Shell und den Anwendungen.
Einige der Befehle, die Sie in einer Shell ausführen, müssen in die Shell integriert werden, da sie auf den Shell-Prozess wirken. Ändert beispielsweise cd
das Arbeitsverzeichnis der Shell, und dies kann nicht von außen erfolgen. Daher cd
muss es sich um einen integrierten Befehl handeln. Dies ist jedoch ein Implementierungsdetail. Ein gelegentlicher Benutzer muss nicht wissen, dass es technische Gründe gibt, die cd
einen integrierten Befehl erfordern .
In einem anderen Extremfall gibt es große Anwendungen, die von verschiedenen Autoren wie Firefox oder Emacs erstellt werden. Diese werden nicht in eine Shell eingebaut, weil sie zu groß sind. Dies ist jedoch keine grundsätzliche Unmöglichkeit, sondern nur eine Frage des Designs. Zum Beispiel gibt es Shells¹, die über integrierte GUI-Anwendungen verfügen.
In der Mitte gibt es Befehle, die in beide Richtungen gehen können. Zum Beispiel muss der echo
Befehl nicht in die Shell eingebaut werden, aber fast jede Shell hat ihn eingebaut, weil er sehr klein ist und häufig verwendet wird und daher effizient sein sollte. Ein anderes Beispiel ist kill
, dass für den gelegentlichen Gebrauch ein externer Befehl sein kann, ein integrierter Befehl jedoch mehrere Vorteile hat: Sie können ihn aufrufen, selbst wenn Sie die Anzahl der Prozesse begrenzt haben, und Sie können ihm einen Shell-Job geben number ( kill %2
) anstelle einer Prozess-ID. Sogar das [ … ]
Konstrukt (das auch geschrieben werden kann test
) könnte im Prinzip ein externer Befehl sein, ist aber aus dem gleichen Grund wie in Shells eingebaut echo
.
Wenn Sie neugierig sind, können Sie den Status eines bestimmten Befehls mit dem type
Befehl überprüfen . Zum Beispiel in meinem Setup:
% type while type setenv cp emacs
while is a reserved word
type is a shell builtin
setenv is a shell function
cp is an alias for cp -i
emacs is /usr/bin/emacs
Reservierte Wörter wie while
und then
sind Teil der Shell-Syntax. Builtins sind Befehle, die in die Shell integriert sind und keine externe ausführbare Datei erfordern. Funktionen sind zusammengesetzte Befehle, die vom Benutzer definiert und benannt werden und über ihren Namen aufgerufen werden können. Aliase sind benutzerdefinierte Kurznamen für längere Befehle (die sich anders als Funktionen verhalten). Das letzte Beispiel ist ein externer Befehl.
¹ dtksh . Es gibt keine kostenlose Implementierung.
/bin/[
existiert und ein fester Link zu den /bin/test
meisten (allen?) * Nix-Boxen ist. Es war kein Bestandteil der klassischen Bourne-Shell. Es gibt auch verwirrende Tiere busybox
, die die meisten Kernbefehle und eine Shell implementieren und entscheiden, welche sie zur Laufzeit haben, indem sie den Namen überprüfen, mit dem sie aufgerufen wurden.
echo
Verwenden Sie für Befehle, die sowohl integriert als auch extern sind, type -a
beide (in der Reihenfolge ihrer Priorität).
Versuchen Sie es mit dem Befehl bash type
. type
beschreibt, was ein Befehl ist: Wenn es sich um eine eingebaute Shell handelt, wenn es sich um einen Alias handelt, wenn es sich um ein anderes Programm handelt ...
Beispiel:
[braga@coleman ~]$ type echo
echo is a shell builtin
[braga@coleman ~]$ type ls
ls is aliased to `ls --color=auto'
[braga@coleman ~]$ type usermod
usermod is /usr/sbin/usermod
Einige sind eingebaut, andere nicht. Verwenden type
Sie diese Option, wenn Sie einen bestimmten Befehl abfragen möchten. In der bash
Dokumentation finden Sie eine Liste aller integrierten Funktionen.
Eingebaute Befehle sind in der Shell selbst enthalten. Wenn der Name eines eingebauten Befehls als erstes Wort eines einfachen Befehls verwendet wird, führt die Shell den Befehl direkt aus, ohne ein anderes Programm aufzurufen.
Aliase ermöglichen das Ersetzen eines Wortes durch eine Zeichenfolge, wenn es als erstes Wort eines einfachen Befehls verwendet wird. Die Shell verwaltet eine Liste von Aliasen, die mit den in Alias und Unalias integrierten Befehlen festgelegt und deaktiviert werden können.
Beide Zitate stammen aus dem Bash-Handbuch .
/usr/bin
oder /bin
. Dies ist größtenteils aus historischen Gründen; Die klassische Bourne-Shell hatte weit weniger Buildins als Bash.
all
Befehle nicht Teil von Bash sind, gibt es keinerest
.