Aus Ihren Kommentaren geht hervor, dass Sie verwirrt darüber sind, was genau eine Shell ist. Der Kernel ist für die Verwaltung des Systems verantwortlich. Es ist der Teil, der Programme lädt und ausführt, auf Dateien zugreift, Speicher zuweist usw. Aber der Kernel hat keine Benutzeroberfläche; Sie können nur mit einem anderen Programm als Vermittler kommunizieren.
Eine Shell ist ein Programm, das eine Eingabeaufforderung ausgibt, eine Eingabezeile liest und sie dann als einen oder mehrere Befehle zum Bearbeiten von Dateien oder zum Ausführen anderer Programme interpretiert. Vor der Erfindung der grafischen Benutzeroberfläche war die Shell die primäre Benutzeroberfläche eines Betriebssystems. Unter MS-DOS wurde die Shell aufgerufen, command.com
und nur wenige Benutzer haben jemals versucht, eine andere zu verwenden. Unter Unix gab es jedoch schon lange mehrere Shells , aus denen Benutzer auswählen konnten.
Sie können in 3 Typen unterteilt werden. Die Bourne-kompatiblen Shells verwenden die von der ursprünglichen Bourne-Shell abgeleitete Syntax . C-Shells verwenden die Syntax der ursprünglichen C-Shell . Dann gibt es nicht-traditionelle Shells, die ihre eigene Syntax erfinden oder sich eine aus einer Programmiersprache leihen und im Allgemeinen viel weniger beliebt sind als die ersten beiden Typen.
Ein eingebauter Befehl ist einfach ein Befehl, den die Shell selbst ausführt, anstatt ihn als Aufforderung zum Laden und Ausführen eines anderen Programms zu interpretieren. Dies hat zwei Haupteffekte. Erstens ist es normalerweise schneller, da das Laden und Ausführen eines Programms einige Zeit in Anspruch nimmt. Je länger die Ausführung des Befehls dauert, desto weniger signifikant ist die Ladezeit im Vergleich zur Gesamtlaufzeit (da die Ladezeit ziemlich konstant ist).
Zweitens kann ein eingebauter Befehl den internen Zustand der Shell beeinflussen. Deshalb cd
müssen Befehle wie eingebaut sein, da ein externes Programm das aktuelle Verzeichnis der Shell nicht ändern kann. Andere Befehle, wie z. B. echo
, sind möglicherweise aus Effizienzgründen eingebaut, aber es gibt keinen eigentlichen Grund, warum es sich nicht um externe Befehle handeln kann.
Welche Befehle integriert sind, hängt von der verwendeten Shell ab. In der Dokumentation finden Sie eine Liste (die bash
integrierten Befehle finden Sie in Kapitel 4 des Handbuchs ). Der type
Befehl kann Ihnen mitteilen, ob ein Befehl eingebaut ist (wenn Ihre Shell POSIX-kompatibel ist), da POSIX type
dies als eingebaut voraussetzt. Wenn which
in Ihrer Shell keine integrierte Komponente vorhanden ist, werden die integrierten Komponenten Ihrer Shell wahrscheinlich nicht erkannt, sondern es wird nur nach externen Programmen gesucht.
Es gibt drei Ebenen von integrierten Dienstprogrammen:
Einige Dienstprogramme sind wirklich Teil der Shell als Programmiersprache, obwohl sie keine reservierten Wörter sind . Sie sind Steuerfluß Utilities (
.
,:
,break
,continue
,return
,trap
,exit
,exec
,eval
), parameter zugehörigen Werkzeuge (set
,unset
,shift
,export
,readonly
,local
¹,typeset
¹), Alias - Dienstprogramme (alias
²,unalias
²) undtimes
³. Diese speziellen Einbauten erhalten eine Sonderbehandlung:foo=bar utility
hat eine andere Bedeutung: Es handelt sich um eine gewöhnliche Parameterzuweisung (dh äquivalent zufoo=bar; utility
), anstatt sie nur für die Dauer des Dienstprogramms der Umgebung zuzuweisen.Einige Dienstprogramme müssen in der Shell implementiert werden, da sie sich auf die internen Einstellungen der Shell auswirken. Das beinhaltet:
cd
,dirs
,pushd
,popd
;bg
,disown
,fg
,jobs
,wait
;builtin
,command
,hash
,read
,type
,ulimit
,umask
;fc
,history
,bind
.echo
,printf
,test
,true
,false
.Erweiterte Shells wie bash , ksh und zsh verfügen in der Regel über mehr integrierte Funktionen, um nicht standardmäßige Funktionen zu implementieren (normalerweise für die Interaktion). Das Handbuch jeder Shell gibt Auskunft darüber, welche Befehle integriert sind, obwohl einige Shells ( zumindest zsh ) dynamisch ladbare Module unterstützen, die mehr integrierte Funktionen bieten.
¹ POSIX unbekannt, jedoch speziell in ksh und mehreren anderen Shells.
² Gewöhnlich in POSIX, aber speziell in ksh und einigen anderen Shells.
³ In
ksh
,times
ist ein Wrapper um dastime
Stichwort: es ist ein Alias für{ { time;} 2>&1;}
. Beachten Sie, dass POSIXtime
ein externes Dienstprogramm mit normalem Parsing oder ein Schlüsselwort sein kann, das für eine gesamte Pipeline gilt (in ksh, in zsh bash).quelle
while IFS= read -r line
?read
ist keine spezielle Funktion, daher wirdIFS=read
die Variable nur für die Dauer des Befehls festgelegt.Ein Builtin ist ein Befehl, der von der Shell und nicht von einem externen Programm bereitgestellt wird. Hier sind die Listen für
bash
die eingebauten Funktionen (sie sind auch in der Bash-Manpage aufgeführt) undzsh
die eingebauten Funktionen .ksh
Liefert eine Liste durch Ausführenbuiltin
.Wenn Sie wissen möchten, ob ein bestimmter Befehl ein integrierter Befehl ist, können Sie ihn ausführen
type command
. Versuchen Sietype for
und diestype ls
zu sehen.quelle
type
scheint den Trick zu tun; danke dafür ... aber ich frage mich immer noch, was "von der Shell bereitgestellt" bedeutet ... Vielleicht muss ich besser verstehen, wie sich die Shell auf den Kernel bezieht ... aber nicht um 2 Uhr morgens. Ich werde kommen zurück zu diesem morgenJede Distribution und Shell hat eine andere Sammlung von Befehlen als die eingebauten Shell-Funktionen. Im Allgemeinen besteht die Idee darin, dass Shells die gebräuchlichsten und einfachsten Funktionen einbauen, um Zeit, Geschwindigkeit und Integrationswillen mit dem Rest ihres Funktionsumfangs zu sparen. Der Overhead ist viel geringer, da kein weiterer Systemprozess gestartet werden muss. Es ist jedoch möglich, zu mischen und anzupassen. Sie können eine Shell ausführen, die ein Build für etwas hat, aber diesen Befehl auch auf Ihrem System haben. Normalerweise hat der eingebaute Code Priorität, aber Sie können dies steuern.
Sie können leicht herausfinden, ob ein bestimmter Befehl ein integrierter Befehl ist oder nicht, indem Sie ihn ausführen
type mycommand
. Die meisten Shell-Manpages enthalten auch eine Liste ihrer eingebauten Funktionen.Bearbeiten: Verwenden
type
Sie diese Option, um herauszufinden, ob es sich bei einem Befehl um einen eingebauten Befehl handelt, und umwhich
zu erfahren, woher er ausgeführt wird.quelle
=>"/bin/echo" and
echo=>"echo is a shell builtin", but 'which dd
=> "/ bin / dd" undtype dd
=> "dd ist / bin / dd" ... also bin ich auf halbem Weg da ....type
ist dies der bessere Indikator für die Ausführung. Sie stellen jedoch fest, dassecho
es sich sowohl um eine integrierte Anwendung als auch um eine Anwendung mit diesem Namen handelt. Wenn Ihre Shell kein eingebautes System hätte, würde eines ausgeführt werden.which
ist nicht unbedingt ein integrierter Befehl, und wenn dies nicht der Fall ist, werden die integrierten Funktionen der Shell nicht berücksichtigt. Für POSIX muss es sichtype
um einen integrierten Befehl handeln, damit es immer über integrierte Befehle informiert ist.which
zutype
oder einer Reihe von Optionen , zum Beispielalias which='type -path'
- könnte dies die Quelle der Verwirrung sein.which
es durch ersetzt wirdtype
. Ich habe das immer wieder benutzt, ohne es zu wissentype
und war sehr erstaunt zu lernen, daswhich
ist nur richtig, wenn ich mich zwischen Programmen entscheide.