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.
Die Frage ist unklar. Wenn allBefehle nicht Teil von Bash sind, gibt es keine rest.
Benutzer unbekannt
@user: Der Rest sind diejenigen, die keine Befehle sind. Wie Pipe und Umleitung.
Tim
Der Rest von was? Schlüsselwörter? Sie denken, Umleitung ist nicht Teil der Bash? Befehle sind nicht? Alles, was kein externes Programm im Pfad ist, ist Teil der Bash. Was sonst?
Benutzer unbekannt
Ich sagte, der Rest sei Teil von Bash. Der Rest beinhaltet auch "für", Variablen, Ausdrücke, ...
Tim
Antworten:
23
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 cddas Arbeitsverzeichnis der Shell, und dies kann nicht von außen erfolgen. Daher cdmuss 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 cdeinen 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 echoBefehl 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 typeBefehl überprüfen . Zum Beispiel in meinem Setup:
% type while type setenv cp emacswhile 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 whileund thensind 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.
Sie werden feststellen, dass dies /bin/[existiert und ein fester Link zu den /bin/testmeisten (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.
RBerteig
echoVerwenden Sie für Befehle, die sowohl integriert als auch extern sind, type -abeide (in der Reihenfolge ihrer Priorität).
Philomath
8
Versuchen Sie es mit dem Befehl bash type. typebeschreibt, 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 typeSie diese Option, wenn Sie einen bestimmten Befehl abfragen möchten. In der bashDokumentation finden Sie eine Liste aller integrierten Funktionen.
Was ist ein eingebautes?
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.
Was ist ein Alias?
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.
Vielen Dank! Sind es Anwendungen, die mit Bash gebündelt sind? Sind sie Shell-Merkmale von Bash? Wie wäre es dann mit Alias?
Tim
@ Tim Ich habe die Antwort um Definitionen für Alias und Builtins erweitert.
Vitor Py
Beachten Sie, dass viele integrierte Funktionen auch als externe Befehle verfügbar sind, wahrscheinlich in /usr/binoder /bin. Dies ist größtenteils aus historischen Gründen; Die klassische Bourne-Shell hatte weit weniger Buildins als Bash.
RBerteig
0
Die meisten Befehle sind nicht Teil der Shell. (Shell führt nur die Binärdatei mit diesem Namen aus.)
Shell implementiert CD und deren Schlüsselwörter für die Skriptsprache (while, for usw.)
Befehle wie Echo und Test können in der Shell implementiert sein oder nicht.
all
Befehle nicht Teil von Bash sind, gibt es keinerest
.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. Dahercd
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, diecd
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 istkill
, 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 kanntest
) könnte im Prinzip ein externer Befehl sein, ist aber aus dem gleichen Grund wie in Shells eingebautecho
.Wenn Sie neugierig sind, können Sie den Status eines bestimmten Befehls mit dem
type
Befehl überprüfen . Zum Beispiel in meinem Setup:Reservierte Wörter wie
while
undthen
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.
quelle
/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 Tierebusybox
, 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:
Einige sind eingebaut, andere nicht. Verwenden
type
Sie diese Option, wenn Sie einen bestimmten Befehl abfragen möchten. In derbash
Dokumentation finden Sie eine Liste aller integrierten Funktionen.Beide Zitate stammen aus dem Bash-Handbuch .
quelle
/usr/bin
oder/bin
. Dies ist größtenteils aus historischen Gründen; Die klassische Bourne-Shell hatte weit weniger Buildins als Bash.quelle