Linux & Shell - Ist Shell ein Muss?

8

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.


quelle
9
Die Verwendung von Linux ohne Shell ist wie das Fahren von Ferrari mit 50 km / h durch den Stadtverkehr. Der ganze Spaß wird einfach verschwinden.
Vava

Antworten:

23

Kann man das nicht ohne das Konzept einer Shell machen?

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) :

"Betriebssystem-Shells fallen im Allgemeinen in eine von zwei Kategorien: Befehlszeilen- und grafische. Befehlszeilen-Shells bieten eine Befehlszeilenschnittstelle (CLI) zum Betriebssystem, während grafische Shells eine grafische Benutzeroberfläche (GUI) bieten Kategorie Der Hauptzweck der Shell besteht darin, ein anderes Programm aufzurufen oder zu "starten". Shells verfügen jedoch häufig über zusätzliche Funktionen, z. B. das Anzeigen des Inhalts von Verzeichnissen.

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.

Mondschatten
quelle
Sie sagen also, dass in Windows die Schaltfläche Start als Shell bezeichnet wird? :-)
5
Es ist keine übliche Verwendung, aber GUIs sind wohl Shells (zumindest wenn sie außerhalb des Kernels ausgeführt werden). Die Schaltfläche Start ist nur eine Funktion der GUI ...
dmckee --- Ex-Moderator Kätzchen
Der Startknopf ist definitiv eine Sache, "die Ihre Absicht interpretiert und das entsprechende Programm aufruft". OTOH, Linux-Shell kann nur als eine Funktion von TUI (Text User Interface) bezeichnet werden.
11
@Paul: Explorer, das Programm, das die Startschaltfläche bereitstellt, ist die Windows-Shell. Tatsächlich handelt es sich um eine Windows-Shell. es kann ersetzt werden.
Mondschatten
1
Ja, die Startschaltfläche kann als Shell angesehen werden. Keine interaktive Shell, aber dennoch eine Shell. Wenn jemand "Shell" sagt, bedeutet dies normalerweise eine interaktive Eingabeaufforderung (z. B. ist die Eingabeaufforderung unter Windows eine herkömmliche Shell)
5

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:

find | grep burek

Dies sind zwei Befehle, findund grep, eine die andere zugeführt wird . findlistet alle Dateien in aktuellen und allen untergeordneten Ordnern auf, eine pro Zeile, und grepdruckt nur die Zeilen aus, die diese enthalten burek.

Nun gibt es andere, komplexere Dinge, wie zum Beispiel:

ls -R | sort | uniq

ls -Rlistet Dateien in aktuellen und untergeordneten Ordnern auf und sortsortiert die Ausgabe. uniqdann 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.

Ivan Vučica
quelle
1

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

nr
quelle
Lesemodus wo?
Thomi
1

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.

dmckee --- Ex-Moderator Kätzchen
quelle
1

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:

for i in $(ls /home/mydir);

oder wie

for i in /home/mydir/*;

Sie führen zu demselben Satz.

KFro
quelle
0
Warum kann ich> ls xy * eingeben und dabei eine korrekte Ausgabe erhalten?
Ich muss * mit einem \ in find - find entkommen. -name xy \ * Is
Shell macht die Wildcard-Erweiterung für eine und nicht für die
andere ausführbare Datei?

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.

William Pursell
quelle
0

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 des lsBefehls: Es passt perfekt zu diesem Schema, wenn ls foo*alle Dateien angezeigt werden, die mit "foo" beginnen! Es wird zu so etwas erweitert

ls foobar boobaz

und 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.

P Shved
quelle
0

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.

Mouviciel
quelle
Und natürlich können Sie Shell-Skripte mitcron
Wuffers
0

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. =)

HayekSplosives
quelle