C shell

C Shell
Tcsh ejecutándose en escritorio Mac OSX.png
TCSH und SH nebeneinander auf einem Mac OS X-Desktop
Originalautor (en) Bill Joy
Erstveröffentlichung 1978; Vor 44 Jahren
Stabile Version
6.20.00 / 24 November 2016; vor 5 Jahren[1]
Repository
Geschrieben in C
Betriebssystem BSD, Unix, Linux, Mac OS
Typ Unix Shell
Lizenz BSD -Lizenz
C Shell läuft weiter Windows -Dienste für UNIX

Das C Shell (CSH oder die verbesserte Version, TCSH) ist ein Unix Shell erstellt von Bill Joy Während er Doktorandin war Universität von Kalifornien, Berkeley In den späten 1970er Jahren. Es wurde weit verbreitet, beginnend mit der 2bsd -Freisetzung der Berkeley Software Distribution (BSD), die Joy 1978 erstmals verteilt hat.[2][3] Andere frühe Mitwirkende zu den Ideen oder dem Code waren Michael Ubell, Eric Allman, Mike O'Brien und Jim Kulp.[4]

Die C Shell ist a Befehlsprozessor Dies wird normalerweise in einem Textfenster ausgeführt, sodass der Benutzer Befehle eingeben und ausführen kann. Die C -Shell kann auch Befehle aus einer Datei lesen, die als a genannt wird Skript. Wie alle Unix -Shells unterstützt es den Dateinamen Wildcarding, Rohrleitungen, Hier Dokumente, Befehlssubstitution, Variablen und Kontrollstrukturen zum Zustandstest und Wiederholung. Was die C -Shell von anderen, insbesondere in den 1980er Jahren, unterschieden, waren seine interaktiven Merkmale und den Gesamtstil. Die neuen Funktionen machten es einfacher und schneller zu bedienen. Der Gesamtstil der Sprache sah eher nach C und wurde als lesbarer angesehen.

Auf vielen Systemen, wie z. Mac OS und Red Hat Linux, CSH ist eigentlich TCSH, eine verbesserte Version von CSH. Oft ist eine der beiden Dateien entweder a harte Verbindung oder ein symbolischer Link Zum anderen, so dass sich der Name auf dieselbe verbesserte Version der C -Shell bezieht.

An Debian und einige Derivate (einschließlich Ubuntu), es gibt zwei verschiedene Pakete: CSH und TCSH. Ersteres basiert auf der ursprünglichen BSD -Version von CSH[5][6] und letzteres ist das verbesserte TCSH.[7][8]

TCSH fügte Dateiname und Befehlsabschluss und Befehlszeilenbearbeitungskonzepte hinzu, die aus dem entlehnt wurden TEMEX System, das ist die Quelle des "t".[9] Da es nur die Funktionalität hinzufügte und nicht geändert hat, was dort war, blieb TCSH geblieben rückwärtskompatibel[10] mit der ursprünglichen C -Schale. Obwohl es als Seitenzweig von der ursprünglichen Quellbaum -Freude begann, ist TCSH jetzt der Hauptzweig für die laufende Entwicklung. TCSH ist sehr stabil, aber neue Releases erscheinen weiterhin ungefähr einmal im Jahr und bestehen hauptsächlich aus geringfügigen Fehlerbehebungen.[11]

Designziele und -funktionen

Die Hauptdesignziele für die C -Shell waren, dass sie eher wie die aussehen sollte C Programmiersprache und dass es für den interaktiven Gebrauch besser sein sollte.

Eher wie c

Das UNIX -System war fast ausschließlich in C geschrieben worden, sodass das erste Ziel der C -Shell eine Befehlssprache war, die stylistischer mit dem Rest des Systems übereinstimmte. Die Schlüsselwörter, die Verwendung von Klammern und die integrierte Grammatik der C-Shell und die Unterstützung von Arrays wurden alle stark von C beeinflusst.

Nach heutigen Maßstäben scheint C Shell nicht besonders C-ähnlich zu sein als viele andere beliebte Skriptsprachen. Aber in den 80ern und 90ern wurde der Unterschied als auffällig angesehen, insbesondere im Vergleich zu Bourne Shell (auch bekannt als Sch) die damals dominante Hülle geschrieben von Stephen Bourne bei Bell Labs. Dieses Beispiel zeigt die konventionelleren C -Shell Ausdrucksoperatoren und Syntax.

Bourne Shell

#!/bin/sh wenn [ $ Tage -Gt 365 ] dann  Echo Das ist über ein Jahr.fi 

C Shell

#!/bin/csh wenn ( $ Tage > 365 ) dann   Echo Das ist über ein Jahr.Endif 

Dem Bourne sh fehlte eine Ausdrucksgrammatik. Der Zustand der quadratischen Klammer musste durch die langsameren Ausführung des Außenbereichs bewertet werden Prüfung Programm. Sh's wenn Befehl nahm seine Argumentwörter als neu Kinderprozess. Wenn das Kind mit einer Null verließ Rückgabe Code, SH suchte nach einer damaligen Klausel (eine separate Aussage, die jedoch häufig in derselben Zeile mit einem Semikolon geschrieben wurde) und läuft diesen verschachtelten Block. Andernfalls würde es das sonst ausführen. Hartnäckig das Testprogramm als beide "Prüfung" und "["Gaben den Notfallvorteil der Quadratklammern und das Erscheinungsbild, dass die Funktionalität des Tests Teil der SH -Sprache war. SHs Verwendung eines umgekehrten Schlüsselworts zum Markieren des Ende eines Kontrollblocks war ein Stil, von dem ausgeliehen wurde Algol 68.[12]

Im Gegensatz dazu konnte CSH den Ausdruck direkt bewerten, was ihn schneller machte. Es behauptete auch eine bessere Lesbarkeit: seine Ausdrücke verwendeten a Grammatik und eine Reihe von Operatoren, die größtenteils aus C kopiert wurden, war keines seiner Schlüsselwörter umgekehrt und der Gesamtstil war auch eher C. C.

Hier ist ein zweites Beispiel: Vergleich von Skripten, die die ersten 10 Kräfte von 2 berechnen.

Bourne Shell

#!/bin/sh i=2 j=1 während [ $ j -le 10 ] tun  Echo '2 **' $ j = $ i    i=`Expr $ i '*' 2`  j=`Expr $ j + 1` erledigt 

C Shell

#!/bin/csh einstellen i = 2 einstellen j = 1 während ( $ j <= 10 )  Echo '2 **' $ j = $ i    @ ich *= 2 @ j ++Ende 

Wieder wegen des Mangels an einer Ausdrucksgrammatik verwendet das SH -Skript Befehlssubstitution und die Expr Befehl. (Modern POSIX Shell tut eine solche Grammatik haben: Die Aussage könnte geschrieben werden i=$((i * 2)) oder : "$((i *= 2))".))

Schließlich ist hier ein drittes Beispiel, das die unterschiedlichen Stile für a zeigt Schaltanweisung.

Bourne Shell

#!/bin/sh zum i in d*tun  Fall $ i in       d?) Echo $ i ist kurz ;;       *) Echo $ i ist lang ;;  ESAC erledigt 

C Shell

#!/bin/csh für jeden i ( d* )  Schalter ( $ i )  Fall d?: Echo $ i ist kurz Breaksw       Ursprünglich: Echo $ i ist lang Endsw Ende 

Im sh script, ";;"Markiert das Ende des Falls, weil SH NULL -Anweisungen anders ausmacht.

Verbesserungen für den interaktiven Gebrauch

Das zweite Ziel war, dass die C -Shell für den interaktiven Gebrauch besser sein sollte. Es führte zahlreiche neue Funktionen ein, die es einfacher, schneller und mehr machten freundlich Verwenden durch Eingabe von Befehlen an einem Terminal. Benutzer konnten die Dinge mit viel weniger Tastenanschlägen erledigen und es lief schneller. Die wichtigsten dieser neuen Merkmale waren die Geschichte und Bearbeitungsmechanismen, Aliase, Verzeichnisstapel, Tilde -Notation, CDPath, Jobkontrolle und Pfad -Hashing. Diese neuen Funktionen erwiesen sich als sehr beliebt, und viele von ihnen wurden seitdem von anderen Unix -Shells kopiert.

Geschichte

Mit dem Verlauf können Benutzer frühere Befehle erinnern und sie erneut ausführen, indem sie nur wenige schnelle Tastenanschläge eingeben. Zum Beispiel zwei Ausrufezeichen eingeben ("!!"))[13] Als Befehl wird der unmittelbar vorhergehende Befehl ausgeführt. Andere kurze Tastenkombinationen, z. B. ", z. B.", "! $"(bedeutet" das endgültige Argument des vorherigen Befehls "), ermöglichen es, dass Teile früherer Befehle zusammengefunden und bearbeitet werden, um einen neuen Befehl zu bilden.

Bearbeitungsbetreiber

Die Bearbeitung kann nicht nur auf dem Text eines vorherigen Befehls, sondern auch auf variablen Substitutionen erfolgen. Die Bediener reichen von einfacher String -Suche/Ersetzen bis zum Parsen eines Pfadnamens zum Extrahieren eines bestimmten Segments.

Aliase

Aliase ermöglichen es dem Benutzer, den Namen eines Alias ​​einzugeben und die C -Shell intern in alle Wörter zu erweitern, die der Benutzer definiert hat. In vielen einfachen Situationen laufen Aliase schneller und sind bequemer als Skripte.

Verzeichnisstapel

Das Verzeichnis Stapel erlaubt dem Benutzer zu Push oder Pop das Aktuelles Arbeitsverzeichnis, erleichtert es, zwischen verschiedenen Stellen im Dateisystem hin und her zu springen.

Tilde Notation

Die Tilde -Notation bietet eine Kurzform, um Pathnames relativ zur Heimverzeichnis Verwendung der "~"Charakter.

Dateiname Abschluss

Das Fluchtschlüssel kann interaktiv verwendet werden, um mögliche Abschlüsse eines Dateinamens am Ende der aktuellen Befehlszeile anzuzeigen.

CDPath

CDPath erweitert den Begriff von a Suchpfad zum CD (Verzeichnis ändern) Befehl: Wenn das angegebene Verzeichnis nicht in der ist Aktuelles VerzeichnisCSH wird versuchen, es in den CDPath -Verzeichnissen zu finden.

Jobkontrolle

In den 1980er Jahren hatten die meisten Benutzer nur einfache Charakter-Mode-Terminals, die mehrere Fenster ausgeschlossen hatten, sodass sie jeweils nur an einer Aufgabe arbeiten konnten. Die Jobkontrolle der C -Shell ermöglichte es dem Benutzer, die aktuelle Aktivität auszusetzen und eine neue Instanz der C -Shell, die als Job bezeichnet wird, durch Eingabe zu erstellen ^Z. Der Benutzer könnte dann zwischen den Jobs mit dem hin und her wechseln fg Befehl. Der aktive Job soll im Vordergrund stehen. Andere Jobs sollen entweder suspendiert (gestoppt) oder im Laufen in der Hintergrund.

Pfad Hashing

Pathhashing beschleunigt die Suche der C Shell nach ausführbaren Dateien. Anstatt einen Dateisystemaufruf in jedem Pfadverzeichnis einzeln auszuführen, bis sie entweder die Datei findet oder keine Möglichkeiten mehr hat, konsultiert die C -Shell einen Internal Hash-tabelle Erstellt durch Scannen der Pfadverzeichnisse. Diese Tabelle kann der C -Shell normalerweise mitteilen, wo die Datei (falls vorhanden) ohne suchen muss, und kann mit dem aktualisiert werden Wiederholung Befehl.

Überblick über die Sprache

Die C Shell betreibt jeweils eine Zeile. Jede Zeile ist tokenisiert in eine Reihe von Wörtern, die durch Leerzeichen oder andere Zeichen mit besonderer Bedeutung getrennt sind, einschließlich Klammern, Rohrleitungen und Eingangs-/Ausgangsumleitung Operatoren, Semikolons und Verstärker.

Grundlegende Aussagen

Eine grundlegende Aussage ist eine, die einfach einen Befehl ausführt. Das erste Wort wird als Name des Befehls angesehen, der ausgeführt wird, und kann entweder ein interner Befehl sein, z. B.. Echo, oder ein externer Befehl. Der Rest der Wörter wird als Argumente an den Befehl übergeben.

Auf der grundlegenden Aussage -Ebene finden Sie hier einige Merkmale der Grammatik:

Wildcarding

Die C-Shell behandelt wie bei allen Unix-Shells jedes Befehlszeilenargument, das Wildcard-Zeichen als Muster enthält, und ersetzt es durch die Liste aller Dateinamen, die übereinstimmen (siehe Kugeln).

  • * entspricht einer beliebigen Anzahl von Zeichen.
  • ? entspricht jedem einzelnen Charakter.
  • [...] entspricht einem der Charaktere in den Quadratklammern. Reichweiten sind mit dem Bindestrich zulässig.
  • [^...] entspricht jedem Charakter nicht im Set.

Die C Shell führte auch mehrere Notationsannehmungen ein (manchmal bekannt als erweiterte Kugeln), seitdem von anderen Unix -Shells kopiert.

  • ABC {def, ghi} ist Wechsel (AKA Ausdehnung der Klammer) und erweitert sich auf ABCDEF ABCGHI.
  • ~ bedeutet das Heimverzeichnis des aktuellen Benutzers.
  • ~ Benutzer meint Benutzer's Home Directory.

Mehrere Wildcards auf Verzeichnisebene, z. B. ",", "*/*.c", sind unterstützt.

Seit Version 6.17.01 rekursive Wildcarding à la ZSH (z.B. "**/*.c" oder "***/*. html") wird auch mit dem unterstützt Globstar Möglichkeit.

Die Verantwortung für die Interpretation von Wildcards war eine wichtige Entscheidung über Unix. Es bedeutete, dass Wildcards mit jedem Befehl und immer auf die gleiche Weise arbeiten würden. Die Entscheidung stützte sich jedoch auf die Fähigkeit von Unix, lange Argumente zu verabschieden Geschäftsführer Systemanruf, mit dem CSH Befehle ausführt. Dagegen auf FensterDie Wildcard -Interpretation wird herkömmlich von jeder Anwendung durchgeführt. Dies ist ein Vermächtnis von MS-DOS, das es nur ermöglichte, eine 128-Byte-Befehlszeile an eine Anwendung übergeben zu werden, wodurch die Wildcarding durch die DOS-Eingabeaufforderung unpraktisch gemacht wird. Obwohl modern Fenster Kann Befehlszeilen von bis zu ungefähr 32 km übergeben Unicode Charaktere, die Belastung für die Wildcard -Interpretation bleibt bei der Anwendung.

E/A -Umleitung

Wenn CSH einen Befehl ausführt, erbt der Befehl standardmäßig die STDIO -Datei des CSH für Stdin, Stdout und Stderr, was normalerweise alle auf die zeigen Konsolenfenster wo die C -Schale läuft. Mit den E/A -Umleitungsoperatoren kann der Befehl stattdessen eine Datei für Eingabe oder Ausgabe verwenden.

  • > Datei bedeutet stdout wird geschrieben an Datei, überschreiben Sie es, wenn es existiert, und erstellen, wenn dies nicht der Fall ist. Fehler kommen immer noch zum Shell -Fenster.
  • > & Datei bedeutet, dass sowohl stdout als auch stderr an geschrieben werden Datei, überschreiben Sie es, wenn es existiert, und erstellen, wenn dies nicht der Fall ist.
  • >> Datei bedeutet, dass Stdout am Ende von angehängt werden Datei.
  • >> & Datei bedeutet, dass sowohl stdout als auch stderr am Ende von angehängt werden Datei.
  • < Datei bedeutet, dass Stdin aus gelesen wird Datei.
  • << Saite ist ein Hier Dokument. Stdin wird die folgenden Einstellungen bis zu dem entsprechen, der übereinstimmt Saite.

Sich beitreten

Befehle können an derselben Zeile verbunden werden.

  • ; bedeutet, den ersten Befehl auszuführen und dann den nächsten.
  • && bedeutet, den ersten Befehl auszuführen und, wenn es mit einer 0 erfolgreich ist Rückgabe Coderennen Sie die nächste.
  • || bedeutet, den ersten Befehl auszuführen und, wenn er mit einem Rückgabecode ungleich Null fällt, den nächsten ausführen.

Rohrleitungen

Befehle können mit einem Rohr angeschlossen werden, wodurch die Ausgabe eines Befehls in die Eingabe des nächsten eingespeist wird. Beide Befehle laufen gleichzeitig.

  • | bedeutet, stdout mit dem nächsten Befehl an stdin zu verbinden. Fehler kommen immer noch zum Shell -Fenster.
  • | & bedeutet, sowohl stdout als auch stderr an stdin des nächsten Befehls zu verbinden.

Gleichzeitig bedeutet "parallel". In einem Multi-Core (Mehrfachprozessor) System, die Rohrbefehle können buchstäblich gleichzeitig ausgeführt werden, sonst die Planer im Betriebssystem Zeitscheiben zwischen ihnen.

Gegeben einen Befehl, z. B. ","a | b", Die Schale erstellt a Rohrstartet dann beide a und b mit stdio für die beiden Befehle umgeleitet so, dass a schreibt seinen Stdout in den Eingang der Rohr b liest Stdin aus der Ausgabe des Rohrs. Rohre werden vom Betriebssystem mit einer gewissen Pufferung implementiert a kann eine Weile schreiben, bevor das Rohr gefüllt ist, aber sobald das Rohr eine neue Schreibweise füllt b liest genug, um neue Schreibvorgänge zu entsperren. Wenn b Versucht, mehr Daten zu lesen als verfügbar. a hat mehr Daten geschrieben oder bis das Rohr schließt, z. B. wenn a Ausgänge.

Variable Substitution

Wenn ein Wort ein Dollar -Zeichen enthält, enthält "$"Die folgenden Zeichen werden als Name einer Variablen angesehen und die Referenz wird durch den Wert dieser Variablen ersetzt. Verschiedene Bearbeitungsoperatoren, die als Suffixe auf die Referenz tippt, die Pfadname -Bearbeitung erlauben (z. B.",: e"Um nur die Erweiterung zu extrahieren) und andere Operationen.

Zitieren und entkommen

Zitierende Mechanismen ermöglichen es ansonsten Sonderzeichen wie Whitespace, Wildcards, Klammern und Dollarschildern wörtlich Text.

  • \ bedeutet, den nächsten Charakter als gewöhnlicher wörtlicher Charakter zu nehmen.
  • "Saite" ist ein schwaches Zitat. Bei geschlossenem Weißkarten und Wildcards werden als Literale angenommen, aber noch variable und Befehlssubstitutionen durchgeführt.
  • 'Saite' ist ein starkes Zitat. Die gesamte geschlossene Saite wird als wörtliches angesehen.

Befehlssubstitution

Die Befehlssubstitution ermöglicht es, die Ausgabe eines Befehls als Argumente für einen anderen zu verwenden.

  • `Befehl` bedeutet, die Ausgabe von zu nehmen BefehlNehmen Sie es in Wörter an und fügen Sie sie wieder in die Befehlszeile ein.

Hintergrundausführung

Wenn die C -Shell einen Befehl startet, wartet normalerweise darauf, dass der Befehl fertiggestellt wird, bevor der Benutzer eine weitere Eingabeaufforderung zur Signalisierung gibt, dass ein neuer Befehl eingegeben werden kann.

  • Befehl & bedeutet Start Befehl im Hintergrund und sofort für einen neuen Befehl einschalten.

Unterschalen

Eine Unterschale ist eine separate untergeordnete Kopie der Shell, die den aktuellen Zustand erbt, aber dann Änderungen vornehmen kann, z. B. am aktuellen Verzeichnis, ohne den Elternteil zu beeinflussen.

  • ( Befehle ) bedeutet rennen Befehle in einer Unterschale.

Kontrollstrukturen

Die C Shell liefert Kontrollstrukturen für beide Zustandstest und Wiederholung. Die Steuerungsteststrukturen für Zustandstests sind die IF- und Switch-Anweisungen. Die Iteration -Kontrollstrukturen sind die Aussagen, foreach und wiederholt.

wenn Anweisung

Es gibt zwei Formen der wenn Anweisung. Die Kurzform wird in eine einzelne Zeile eingegeben, kann jedoch nur einen einzigen Befehl angeben, wenn der Ausdruck wahr ist.

wenn ( Ausdruck ) Befehl

Die Langform verwendet dann, sonst und endif -Schlüsselwörter, damit die Befehlblöcke in der Bedingung verschachtelt werden können.

wenn ( Ausdruck1 ) dann   Befehlesonst wenn ( Ausdruck2 ) dann   Befehle ...anders   BefehleEndif 

Wenn die sonst und wenn Schlüsselwörter in derselben Zeile erscheinen, nistet CSH -Ketten, anstatt sie zu nisten; Der Block wird mit einem einzigen Endif beendet.

Schaltanweisung

Die Switch -Anweisung vergleicht eine Zeichenfolge mit einer Liste von Mustern, die Platzhalterzeichen enthalten können. Wenn nichts übereinstimmt, wird die Standardaktion, wenn es einen gibt, ergriffen.

Schalter ( Saite )  Fall Muster1: Befehle Breaksw     Fall Muster2: Befehle Breaksw         ... Ursprünglich: Befehle Breaksw Endsw 

Während der Aussage

Das Während der Aussage bewertet einen Ausdruck. Wenn es wahr ist, führt die Shell die verschachtelten Befehle aus und wiederholt sich so lange, wie der Ausdruck wahr bleibt.

während ( Ausdruck )     BefehleEnde 

Foreach -Erklärung

Die Foreach -Anweisung enthält eine Liste von Werten, normalerweise eine Liste von Dateinamen, die durch Wildcarding erzeugt werden, und legt dann für jeden die Schleifenvariable auf diesen Wert fest und führt die verschachtelten Befehle aus.

für jeden Loop-Variable ( Liste von Werten )     BefehleEnde 

Wiederholung Anweisung

Die Wiederholungsanweisung wiederholt einen einzelnen Befehl eine integrale Anzahl von Male.

wiederholen Integer -Befehl

Variablen

Die C -Schale implementiert sowohl Shell als auch Umgebungsvariablen.[14] Umgebungsvariablen, erstellt mit dem setEnv Aussage sind immer einfache Saiten, übergeben an jeden Kinderprozesse, die diese Variablen über die abrufen envp [] Argument an hauptsächlich().

Shell -Variablen, die mit dem erstellt wurden einstellen oder @ Aussagen sind intern für C Shell. Sie werden nicht an Kinderprozesse übergeben. Schalenvariablen können entweder einfache Saiten oder Zeichenfolgen sein. Einige der Shell -Variablen werden vordefiniert und verwendet, um verschiedene interne C -Shell -Optionen zu kontrollieren, z. B. was passieren sollte, wenn eine Wildcard nichts entspricht.

In aktuellen Versionen von CSH können Saiten von willkürlicher Länge weit in Millionen von Charakteren sein.

Ausdrücke

Die C-Shell implementiert eine 32-Bit-Ganzzahl-Expression-Grammatik mit den von C ausgeliehenen Betreibern, jedoch mit einigen zusätzlichen Betreibern für String-Vergleiche und Dateisystemtests, z. B. Tests auf das Vorhandensein einer Datei. Die Betreiber müssen durch Whitespace von ihren Operanden getrennt werden. Variablen werden als bezeichnet als $Name.

Vorrang wird auch von C geliehen, aber mit anderen Operator Assoziativität Regeln zur Lösung der Unklarheit dessen, was in einer Sequenz gleicher Vorrangbetreiber zuerst kommt. In C ist die Assoziativität für die meisten Betreiber links nach rechts. In C Shell ist es rechts von links. Zum Beispiel,

// c Gruppen von links int i = 10 / 5 * 2; printf( "%d\n", i ); // Drucke 4 i = 7 - 4 + 2; printf( "%d\n", i ); // Drucke 5 i = 2 >> 1 << 4; printf( "%d\n", i ); // Drucke 16 
# C Shell -Gruppen von rechts @ i = 10/5 * 2Echo $ i # Drucke 1 @ i = 7 - 4 + 2 Echo $ i # Drucke 1 @ i = ( 2 >> 1 << 4 ) Echo $ i # Drucke 0 

Die Klammern im C-Shell-Beispiel sollen vermeiden, dass die Bitverschiebungsoperatoren als E/A-Umleitungspflicht verwirrt werden. In beiden Sprachen können Klammern jederzeit verwendet werden, um explizit die gewünschte Bewertungreihenfolge anzugeben, wenn auch nur für Klarheit.

Rezeption

Obwohl Stephen Bourne selbst räumte an, dass CSH seiner Hülle für den interaktiven Gebrauch überlegen war,[15] Es war noch nie so beliebt für Scripting. Zunächst und in den 1980er Jahren konnte CSH nicht garantiert auf allen Unix -Systemen garantiert sein, aber SH konnte es zu einer besseren Wahl für alle Skripte machte, die möglicherweise auf anderen Maschinen ausgeführt werden müssen. Mitte der neunziger Jahre war CSH weit verbreitet, aber die Verwendung von CSH für Skripten wurde mit neuer Kritik der Kritik ausgesetzt Posix Komitee,[16] die spezifizierten, dass es nur eine bevorzugte Hülle geben sollte, die Kornshellsowohl für interaktive als auch für Skriptzwecke. Die C -Schale wurde auch von anderen kritisiert[17][18] über die mutmaßlichen Mängel von C Shell in Syntax, fehlende Merkmale und schlechte Implementierung.

  • Syntaxfehler: Im Allgemeinen waren einfache, aber unnötige Inkonsistenzen in der Definition der Sprache. Zum Beispiel die einstellen, setEnv und alias Befehle alle taten im Grunde dasselbe, nämlich einen Namen mit einer Zeichenfolge oder einem Satz von Wörtern. Aber alle drei hatten leichte, aber unnötige Unterschiede. Für a war ein gleiches Zeichen erforderlich einstellen aber nicht für setEnv oder alias; Klammern wurden um eine Wortliste für a benötigt einstellen aber nicht für setEnv oder aliasusw. ähnlich die wenn, Schalter und Looping -Konstrukte verwenden unnötig unterschiedliche Schlüsselwörter (Endif, Endsw und Ende) die verschachtelten Blöcke zu kündigen.
  • Fehlende Merkmale: Am häufigsten zitiert sind die mangelnde Fähigkeit, die zu manipulieren stdio Die Datei wird unabhängig voneinander verarbeitet und Unterstützung für Funktionen. Während die Bourne -Shell -Funktionen nur lokale Variablen fehlten, waren die Aliase von CSH - das engste Analogon in CSH zu Funktionen - auf einzelne Codezeilen beschränkt, obwohl die meisten Strömungssteuerungskonstrukte zu erkennen mussten. Infolgedessen konnten CSH -Skripte nicht funktional funktionsfähig sein, da C -Programme selbst sein könnten, und größere Projekte neigten dazu, entweder auf Bourne Shell Scripting oder C -Code zu wechseln.
  • Die Implementierung: die einen Ad -hoc verwendete Parser, hat die schwerwiegendste Kritik gezogen. In den frühen 1970er Jahren, Compiler Die Technologie war ausreichend ausgereift[19] dass die meisten neuen Sprachimplementierungen entweder a verwendeten von oben nach unten oder Bottom-up-Parser in der Lage, eine vollständig rekursive Erkennung zu erkennen Grammatik. Es ist nicht bekannt, warum stattdessen ein Ad -hoc -Design für die C -Schale ausgewählt wurde. Es mag einfach sein, dass Joy es 2009 in ein Interview stellte: "Als ich anfing, dieses Zeug mit Unix zu machen, war ich kein sehr guter Programmierer."[20] Das Ad -hoc -Design bedeutete, dass die C -Shell -Sprache nicht vollständig rekursiv war. Es gab eine Grenze, wie komplex ein Befehl es tun konnte.

Es funktionierte für die meisten interaktiv typisierten Befehle, aber für die komplexeren Befehle, die ein Benutzer in einem Skript schreiben könnte, könnte es leicht scheitern und nur eine kryptische Fehlermeldung oder ein unerwünschtes Ergebnis erzeugen. Zum Beispiel konnte die C -Schale keine Rohrleitungen zwischen Kontrollstrukturen unterstützen. Versuch, die Ausgabe von a zu leiten für jeden Befehl in Grep Einfach nicht funktioniert. (Die Arbeit, die für viele der Beschwerden im Zusammenhang mit dem Parser funktioniert, besteht darin, den Code in separate Skripte aufzuteilen. Wenn die für jeden wird in ein separates Skript verschoben, Piping funktioniert, da Skripte durch Abgabung einer neuen Kopie von CSH ausgeführt werden, die die richtigen Stdio -Handles erben.)

Ein weiteres Beispiel ist das unerwünschte Verhalten in den folgenden Fragmenten. Beide scheinen zu bedeuten: "Wenn 'MyFile' nicht existiert, erstellen Sie es, indem Sie 'Mytext' in ihn schreiben." Die Version auf der rechten Seite erstellt jedoch immer eine leere Datei, da die Bewertung der C -Shell in der Bewertung der E/A -Umleitung in jeder Befehlszeile suchen und bewerten, bevor sie den Rest der Zeile untersucht, um festzustellen, ob sie enthält, ob sie enthält eine Kontrollstruktur.

# Funktioniert wie erwartet wenn (! -e myfile ) dann  Echo mytext> myfile endif
# Erstellt immer eine leere Datei wenn (! -e myfile) Echo Mytext> myfile
# Problemumgehung wenn (! -e myfile) bewerten "Echo Mytext> myfile" 

Die Implementierung wird auch wegen ihrer notorisch schlechten Fehlermeldungen kritisiert, z. B. "0 Ereignis nicht gefunden", was keine nützlichen Informationen über das Problem liefert.

Durch das Üben ist es jedoch möglich, diese Mängel zu überwinden (so den Programmierer zu unterweisen, bessere und sicherere Ansätze für die Implementierung eines Skripts zu verfolgen).

( (: <myfile ) > & /dev /null && Echo Datei existiert. ) || ( ( Echo Mytext> myfile ) > & /dev /null && Echo Datei erstellt. ) || ( Echo Kann Datei nicht erstellen. ) 

Beeinflussen

64-Bit Hamilton C Shell auf einen Windows 7 Desktop.

Die C Shell war äußerst erfolgreich bei der Einführung einer großen Anzahl von Innovationen, einschließlich der Geschichte Mechanismus, Aliase, Tilde Notation, interaktiver Dateiname -Abschluss, eine in die Hülle eingebaute Ausdrucksgrammatik und mehr, die seitdem von anderen Unix -Shells kopiert wurden. Aber im Gegensatz zu Sch, was eine große Anzahl von unabhängig entwickelten Klonen hervorgebracht hat, einschließlich ksh und verprügeln, nur zwei CSH Klone sind bekannt. (Seit TCSH basierte auf dem CSH -Code, der ursprünglich von Bill Joy verfasst wurde, und wird nicht als Klon angesehen.)

1986,, Allen Holub schrieb Auf Befehl: Schreiben einer Unix-ähnlichen Shell für MS-DOS,[21] Ein Buch, das ein Programm beschreibt, das er mit dem Titel "SH" geschrieben hatte, das aber tatsächlich das Sprachdesign und die Merkmale von CSH kopierte, nicht Sh. Begleitdisketten mit der vollständigen Quelle für SH und für eine grundlegende Reihe von UNIX-ähnlichen Versorgungsunternehmen (CAT, CP, GREP usw.) waren vom Verlag für 25 bzw. 30 US-Dollar erhältlich. Die Kontrollstrukturen, die Expressionsgrammatik, der Geschichtsmechanismus und andere Merkmale in Holubs SH waren identisch mit denen der C -Schale.

1988 begannen Hamilton Laboratories mit dem Versand Hamilton C Shell zum OS/2.[22] Es enthielt sowohl einen CSH-Klon als auch eine Reihe von UNIX-ähnlichen Versorgungsunternehmen. Im Jahr 1992 wurde Hamilton C Shell für veröffentlicht Windows NT.[23] Die Windows -Version wird weiterhin aktiv unterstützt, aber die OS/2 -Version wurde 2003 eingestellt.[23] Eine schnelle Referenz Anfang 1990[24] beschrieb die Absicht als "vollständige Einhaltung der gesamten C -Shell -Sprache (außer Jobkontrolle) "Aber mit Verbesserungen des Sprachdesigns und der Anpassung an die Unterschiede zwischen UNIX und PC. Die wichtigste Verbesserung war a Top-Down-Parser das erlaubte Kontrollstrukturen Um verschachtelt oder gepflückt zu werden, konnte die ursprüngliche C -Schale angesichts ihres Ad -hoc -Parsers nicht unterstützen. Hamilton fügte auch neue Sprachfunktionen hinzu, einschließlich integrierter und benutzerdefinierter Verfahren, blockstrukturierte lokale Variablen und Gleitkomma-Arithmetik. Die Anpassung an einen PC beinhaltete Unterstützung für den Dateinamen und andere Konventionen auf einem PC und die Verwendung von Themen Anstatt von Gabeln (die weder unter OS/2 noch Windows verfügbar waren), um zu erreichen Parallelitätz. B. bei der Einrichtung einer Pipeline.

Siehe auch

Verweise

  1. ^ Zoulas, Christos (24. November 2016). "TCSH-6.20.00 ist jetzt verfügbar!". mx.gw.com. Archiviert von das Original am 25. November 2016. Abgerufen 24. November 2016.
  2. ^ Harley Hahn, Harley Hahns Leitfaden zu Unix und Linux.
  3. ^ Berkeley Engineering Lab Notes, Band 1, Ausgabe 2, Oktober 2001 Archiviert 9. Juli 2010 bei der Wayback -Maschine.
  4. ^ Eine Einführung in die C Shell durch Bill Joy.
  5. ^ Ubuntu - Details des Pakets CSH. Pakete.ubuntu.com.
  6. ^ Debian - Details des Pakets CSH. Pakete.debian.org.
  7. ^ Ubuntu - Details des Pakets TCSH. Pakete.ubuntu.com.
  8. ^ Debian - Details des Pakets TCSH. Pakete.debian.org.
  9. ^ Ken Greer (3. Oktober 1983). "C Shell mit Befehl und Dateiname Erkennung/Fertigstellung". Newsgroup:net.Sources. Abgerufen 29. Dezember 2010.
  10. ^ TCSH (1) MAN SEITE. TCSH.
  11. ^ Behebung der Datei in TCSH-17 Juni 2000.
  12. ^ Betreff: Spätblüte überprüft Usenet Post to Comp.lang.misc von Piercarlo "Peter" Grandi, Abteilung von CS, UCW Aberystwyth, Großbritannien, 17. Dezember 1989.
  13. ^ Ausgesprochen "Bang, Bang"
  14. ^ Troy, Douglas (1990). UNIX -Systeme. Berechnung von Grundlagen. Benjamin/Cumming Publishing Company. p. 25.
  15. ^ Bourne, Stephen R. (Oktober 1983). "Die Unix -Shell". BYTE. p. 187. Abgerufen 30. Januar 2015.
  16. ^ IEEE -Standard für Informationstechnologie, tragbare Betriebssystemschnittstelle (POSIX), Teil 2: Shell and Utilities, Band 2. IEEE STD 1003.2-1992, S. 766-767. ISBN1-55937-255-9.
  17. ^ CSH -Programmierung als schädlich angesehen von Tom Christiansen
  18. ^ Top zehn Gründe, die C -Shell nicht zu verwenden Von Bruce Barnett
  19. ^ David Gries (1971). Compiler -Konstruktion für digitale Computer. John Wiley & Sons. ISBN0-471-32776-x.
  20. ^ Bill Joy im Gespräch mit Brent Schlender, Churchill Club, Santa Clara, Kalifornien, 11. Februar 2009 Archiviert 30. März 2010 bei der Wayback -Maschine.
  21. ^ Holub, Allen (1986–1987). Auf Befehl: Schreiben einer Unix-ähnlichen Shell für MS-DOS (Zweite Ausgabe). M & T Books, Redwood City, CA. ISBN 0-934375-29-1.
  22. ^ Hamilton, Douglas. "Hamilton C Shell -Ankündigung" (PDF). IBM Personal Systemsentwickler (Sommer 1989): 119–121. Abgerufen 11. Juli 2020.
  23. ^ a b Hamilton, Nicole (5. März 2017). "Hamilton C Shell für Windows -Versionsnotizen 5.2.g". Hamilton Laboratories, Redmond, WA. Abgerufen 3. April 2018.
  24. ^ Hamilton C Shell Schnellreferenz (PDF). Hamilton Laboratories, Wayland, MA. 1988–1990. Abgerufen 11. Juli 2020.

Weitere Lektüre

Externe Links