Eine total neue Frage.
Warum brauchen wir eine Shell unter Linux? Als Beispiel, wenn ich tippe - finde. -name xy * - Mir wurde gesagt, dass die Shell diese Eingabe übernimmt und den Befehl find aufruft (um sicherzustellen, dass der Platzhalter korrekt interpretiert wird und so weiter). Kann dies nicht ohne das Konzept einer Shell geschehen? ... Wenn die Shell die verschiedenen Prozesse verfolgt, kann dies nicht ohne sie geschehen?
Warum kann ich auch> ls xy * eingeben und eine korrekte Ausgabe erhalten, während ich * mit einem \ in find - find entkommen muss? -name xy \ * Führt die Shell die Platzhaltererweiterung für die eine und nicht für die andere ausführbare Datei durch?
Vielen Dank.
Antworten:
Nun, nein. Sie benötigen etwas, das Ihre Absicht interpretiert und das entsprechende Programm aufruft. Das Ding heißt Muschel.
BEARBEITEN: Um Verwirrung zu vermeiden, bedeutet "Shell" nicht "Befehlszeilenschnittstelle". Von http://en.wikipedia.org/wiki/Shell_(computing) :
Was Ihre andere Frage betrifft, führt die Shell für beide Befehle eine Platzhaltererweiterung durch. Wenn Sie jedoch nach Dateien mit find suchen, möchten Sie find und nicht mit der Shell, um die Erweiterung durchzuführen, da Sie möchten, dass sie an den gesuchten Speicherorten durchgeführt wird an und nicht an dem Ort, von dem aus es aufgerufen wurde; Daher entkommen Sie dem *, um zu verhindern, dass die Shell sie erweitert, damit find sie sehen kann.
quelle
Sie können natürlich alles über eine GUI erledigen. Windows 'Dateien suchen (von XP und früher) entspricht in gewisser Weise dem von Ihnen eingegebenen Befehl.
Warum mögen UNIX- (und Linux-) Benutzer Shell? Weil Sie die Ausgabe übernehmen, in ein anderes Programm einspeisen und eine andere Ausgabe erhalten können. Zum Beispiel:
Dies sind zwei Befehle,
find
undgrep
, eine die andere zugeführt wird .find
listet alle Dateien in aktuellen und allen untergeordneten Ordnern auf, eine pro Zeile, undgrep
druckt nur die Zeilen aus, die diese enthaltenburek
.Nun gibt es andere, komplexere Dinge, wie zum Beispiel:
ls -R
listet Dateien in aktuellen und untergeordneten Ordnern auf undsort
sortiert die Ausgabe.uniq
dann gibt uns nur eindeutige Zeilen.Während Sie all dies in eine GUI codieren können, können Sie mit der Befehlszeile schnell so knifflige Dinge erledigen, die Sie normalerweise mit der GUI nur tun können, wenn Sie Ihre eigene schreiben. In diesem Fall ist es schneller, es einfach in die Befehlszeile einzugeben, nicht wahr?
Fazit: Wenn Sie dies fragen, brauchen Sie es nicht. Die Befehlszeile ist für Sie als normaler Benutzer nutzlos. Die Befehlszeile eignet sich jedoch hervorragend für Systemadministratoren, Entwickler und diejenigen, die schnell und schnell mit ihrem Computer herumspielen möchten.
quelle
Ja, Sie können den Befehl find ohne Shell ausführen. Sie benötigen jedoch ein Programm, um ihn zu starten, und ein Programm, um die Ausgabe anzuzeigen. Oft verwenden Sie Funktionen der Shell, und dieser Befehl benötigt eine Shell, um die Absicht zu interpretieren.
ZB Piping, Redirection und Globbing sind ein Merkmal der Shell und benötigen eine Shell zur Interpretation. "find. -name myfile" verwendet keine Funktion einer Shell und kann ohne Shell ausgeführt werden. "find. -name myfile | sort> output" verwendet sowohl Piping als auch Redirection und Sie benötigen eine Shell, um dies zu interpretieren.
Wenn Sie xy * entkommen, gibt es kaum einen Unterschied, ob es sich um die zu findende Eingabe oder die Ausgabe einer Rediction handelt. Die Shell erweitert sie in beide Richtungen.
Wenn sich im aktuellen Verzeichnis eine Datei mit dem Namen xyz befindet
finden . -name xy * wird tatsächlich als find ausgeführt. -name xyz, was wahrscheinlich nicht das ist, was du willst.
Wenn Sie finden. -name xy * und es gibt keine Datei, die mit xy * im aktuellen Verzeichnis übereinstimmt. Es wird als find ausgeführt. -name xy *.
Wenn im aktuellen Verzeichnis keine mit xy * übereinstimmende Datei vorhanden ist, erstellt ls> xy * eine Datei mit dem Namen xy *. Wenn eine Datei übereinstimmt - sagen wir xyz - bedeutet dies ls> xyz. Wenn mehrere Dateien mit xy * übereinstimmen, schlägt ls> xy * fehl.
Lesen Sie mehr http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
quelle
Nicht triviale Betriebssysteme führen den Befehlszeileninterpreter nicht im Kernel aus.
Sie führen Sie es als Programm, und das Programm wird als eine Shell. Die Situation auf GUIs scheint gemischt zu sein, aber zumindest einige Betriebssysteme führen diese auch außerhalb des Kernels aus.
Jetzt gibt es absolut keine Notwendigkeit für die Shell zu arbeiten wie die Unix - Shell, aber Sie tun eine Schnittstelle benötigen.
quelle
Um Ihre zweite Frage zu beantworten ... versucht die Shell, alles zu erweitern, was sie kann, wann immer es möglich ist, es sei denn, Sie verhindern dies. Das Escapezeichen * verhindert die Erweiterung, die normalerweise für den Befehl find erforderlich ist.
Um eine Frage nicht mit einer Frage zu beantworten, woher wissen Sie, ob der Befehl ls die Dateien aufgrund einer Befehlszeilenerweiterung auflistet oder ob der Befehl ls die Verzeichnisliste im Dateisystem legitim nachgeschlagen hat? Zum Beispiel könnte ich eine Shell für eine Schleife wie diese schreiben:
oder wie
Sie führen zu demselben Satz.
quelle
Der Punkt, an dem '*' im Suchaufruf maskiert wird, besteht darin, zu verhindern, dass die Shell die Erweiterung ausführt. Indem Sie es maskieren, stellen Sie sicher, dass find die Argumente ".", "-Name", "xy *" sieht. Wenn Sie dem '*' nicht entkommen, würde find ".", "-Name", "xya", "xyz" sehen (vorausgesetzt, die Shell erweitert "xy *" auf "xya xyz", was in diesem Fall der Fall ist Dateien, die xy starten, sind xya und xyz). Die Antwort auf Ihre Frage lautet also "Nein". Die Shell erweitert das "*" in Ihrem Aufruf von "find" nicht, da Sie ausdrücklich darum gebeten haben, dies nicht zu tun, indem Sie ihm entkommen.
quelle
Shell unter Linux ist eine bequeme und konventionelle Möglichkeit, mit dem Dateisystem unter Linux zu interagieren und Befehle mit Argumenten und in Bezug auf Umgebungsvariablen auszuführen. Es bietet viele nützliche Funktionen, z. B. das Verbinden der Ausgabe eines Prozesses mit der Eingabe eines anderen, das Umleiten von Eingabe- / Ausgabestreams zu / von Dateien, FIFOs usw. Eine Shell ist eine gute Möglichkeit, mehrere kleine Programme auf einfache Weise zu kombinieren eine relativ kleine Aufgabe zu erledigen, um etwas Nützliches bereitzustellen. Einige dieser Programme (wie find und ls) wurden für die Arbeit mit ihnen in einer Shell entwickelt.
Um die Erweiterung zu verstehen, denken Sie lediglich daran, dass ein Wort (raumbegrenzte Folge von aplhanumerischen Zeichen und
-
und einigen anderen Symbolen), sofern es Zeichen enthält*
oder?
Muster enthält , nicht maskiert oder in Anführungszeichen ("
) oder Apostrophe gesetzt'
wird und durch eine Reihe ersetzt wird von durch Leerzeichen getrennten Wörtern mit Dateinamen, die dem Muster entsprechen. Wenn Sie also ein Wort mit einem Sternchen hatten, haben Sie nach der Erweiterung null, ein oder mehrere Wörter, die von bash als mehrere Argumente behandelt werden. Hier kommt das spezifische Design desls
Befehls: Es passt perfekt zu diesem Schema, wennls foo*
alle Dateien angezeigt werden, die mit "foo" beginnen! Es wird zu so etwas erweitertund ls druckt nur Dateien aus Argumenten, prüft auf Existenz und geht in Fiolders usw. über.
Aber das ist meistens die Frage der Philosophie. In anderen Systemen ergibt sich alles aus der Schaltfläche "Start" und der Taskleiste. Einige Benutzer sind damit einverstanden. Einige versuchen, eine Linux-ähnliche Shell in solche Systeme zu installieren. Das ist Geschmackssache, aber für die Programmierung einfacher Skripte, die sich mit Dateien befassen, ist die Shell äußerst praktisch.
quelle
Bei interaktiven Befehlen kann die Shell durch eine GUI ersetzt werden.
Der entscheidende Punkt der Shell ist jedoch, dass es sich um eine Skriptsprache handelt: Sie können ganze Programme erstellen, die in bestimmten Situationen ausgeführt werden (Booten, Öffnen der Sitzung, jeden Tag, ...). Diese Funktion kann nicht durch andere Tools ersetzt werden.
quelle
cron
Natürlich könnten Sie Linux ausführen und niemals die Shell verwenden. Viele Standard-Linux-Distributionen bieten einem Heimanwender genau das, was er benötigt, wenn er nur Facebook überprüfen, Bilder ansehen und E-Mails senden möchte.
Linux hat viele Profis, aber die Shell ist wahrscheinlich die beste. Die Shell ermöglicht die E / A-Umleitung. Dies ist, worüber die Leute sprechen, wenn sie sich auf Rohre beziehen ("|"). Zum Beispiel:
Ich möchte eine Verbindung zu einer Liste von Computern herstellen und eine Umfrage durchführen, wo ein Benutzerkonto vorhanden ist:
for host in `cat hostnames.txt1`; do
echo "Connecting to $host"
ssh $host "cat /etc/passwd | grep -i username"
done
In hostnames.txt können sich 0 Hosts befinden, oder es können Tausende vorhanden sein. Dieses Skript wird die Umfrage durchlaufen und die Informationen an stdout weitergeben.
Skripte können sehr kreativ werden. Ich kann die Zeichen "/ >>" verwenden, um die Eingabe / Ausgabe von und zu Dateien umzuleiten. Ich könnte alle diese Maschinen im obigen Skript untersuchen, den Servernamen von allen Computern, die den Benutzer haben, in eine Datei ausgeben und dann ein anderes Skript verwenden, das eine Verbindung zum Benutzerkonto herstellt und eine Aufgabe ausführt (Sperren / Entsperren / Zurücksetzen von pw /) Gruppe entfernen / hinzufügen / etc).
Lernen. Zu. Skript. =)
quelle