Shell und Anwendungen

7

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.

Tim
quelle
3
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 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 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.

Gilles 'SO - hör auf böse zu sein'
quelle
1
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.

Beide Zitate stammen aus dem Bash-Handbuch .

Vitor Py
quelle
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.
jkj
quelle