Ich betrachte mich als glücklichen Bash-Benutzer. Als ich jedoch anfing, Unix zu erkunden, befand es sich auf einem proprietären Unix-System, das standardmäßig tcsh bereitstellte, sodass meine ersten Shell-Erfahrungen auf einer modernen Version der C-Shell (csh) lagen. Das stellte sich als glücklicher Zufall heraus, denn tcsh war auch die Shell der Wahl in dem Filmstudio, in dem ich später in meiner Karriere arbeitete.
Weitere Linux-Ressourcen
- Spickzettel für Linux-Befehle
- Spickzettel für fortgeschrittene Linux-Befehle
- Kostenloser Online-Kurs:RHEL Technical Overview
- Spickzettel für Linux-Netzwerke
- SELinux-Spickzettel
- Spickzettel für allgemeine Linux-Befehle
- Was sind Linux-Container?
- Unsere neuesten Linux-Artikel
Bis heute verbinde ich mehrere Aufgaben mit tcsh, auch wenn es da keinen logischen Zusammenhang gibt. Ich verwende tcsh immer noch auf mindestens einem System, und sei es nur, um in der Praxis zu bleiben. Ich lasse es auch auf allen meinen Systemen installiert, um die Kompatibilität mit meinen eigenen tcsh-Skripten aufrechtzuerhalten und sicherzustellen, dass ich es starten kann, wenn ich ein Skript schreiben muss, das ich lieber in tcsh haben möchte.
Der Unterschied zwischen C-Shell und Bash
Tcsh ist die moderne Fortsetzung von csh. Als die C-Shell 1978 veröffentlicht wurde, waren die Benutzer von ihrer C-ähnlichen Syntax begeistert. C war zu dieser Zeit eine neue Programmiersprache, und was noch wichtiger ist, es war das, in dem Unix geschrieben wurde, sodass die meisten Unix-Benutzer sich mit C wohler fühlten als mit einer beliebigen Skriptsprache. In Bash beispielsweise dieser if
Schleife macht einen "geheimen" Aufruf an test
binär, um die bedingte Anweisung (den Teil in Klammern) auszuwerten:
v=1
if [ $v -gt 0 ]
then
echo "verbose"
fi
Hier ist die gleiche Anweisung in csh oder tcsh, ohne einen externen Aufruf von test
weil die bedingte Anweisung (der Code in Klammern) die eingebaute Auswertung von csh verwendet:
set v=1
if ($v > 1) then
echo "verbose"
endif
Dies zeigt ein paar Dinge, sowohl gute als auch schlechte. Zum Beispiel ist es für einen C-Programmierer selbstverständlich, eine Bedingung in Klammern einzugeben, und aus der Perspektive eines Programmierers ist es wünschenswert, eine mathematische Auswertung in die ausführbare Datei eingebaut zu haben. Andererseits ist der if
Schleifensyntax hat mehr mit Lua gemeinsam als mit C, das geschweifte Klammern als Trennzeichen verwendet:
// this does not work in Csh
if ( v>1 ) {
printf("verbose");
}
In gewisser Weise fasst dies csh gut zusammen:Es ist sauber, effizient und einigen vertraut, aber skurril und inkonsistent.
Warum also verwenden?
Tcsh für Genauigkeit
Ich schreibe mehr C++- und Java- als C-Code, daher hat mein Interesse an tcsh wenig mit seinem historischen Anspruch auf Ruhm zu tun. Ich genieße jedoch Lua, und in gewisser Weise denke ich an tcsh und andere Shells, wie ich an Lua und Python oder sogar Markdown und Docbook denke. Beide Shells haben ihren Wert, und es ist leicht, auf die beliebtere zu verweisen, aber die andere ist strikt klar. Tatsächlich habe ich das Gefühl, dass tcsh eine Präzision hat, die vielen anderen Shells fehlt.
Variablen
Sie haben in Shells nicht den Luxus typisierter Variablen, aber mit tcsh können Sie sie zumindest mit einem Schlüsselwort deklarieren. Seltsamerweise gibt es mehrere Schlüsselwörter, die Sie für die Aufgabe verwenden können, aber das, auf das ich mich festgelegt habe, war set
:
> set var=foo
> echo $var
foo
Sie können Variablen erweitern, indem Sie den Namen der Variablen eingeben (var
in diesem Beispiel) und dann Strg+X drücken gefolgt von $ (Dollar) Taste. Das obige Beispiel setzt var
zu foo
.
Wie bei vielen anderen Shells können Sie alle gesetzten Variablen mit set
auflisten alleine ohne Argumente:
> set
term xterm
tty pts/2
uid 1000
user seth
var foo
[...]
Sie können eine Variable mit unset
zurücksetzen Befehl:
> unset var
> set | grep var
>
Fehlende Funktionen sind eine Funktion
Vielleicht haben Sie Zeilen wie diese in einem Skript gesehen:
var=GitLab
${var,,}
Die zweite Zeile ist eine eingebaute Funktion, um den Inhalt von var
umzuwandeln in Kleinbuchstaben.
Während zusätzliche Funktionen wie diese unendlich nützlich sind, habe ich manchmal das Gefühl, dass sie zur Verschleierung einladen. Shell-Scripting ist wie das HTML der Programmierung; Es ist eine der wenigen ernsthaften Sprachen, die Sie sich selbst beibringen können, indem Sie einfach den Code anderer Leute lesen. Das ist nicht unbedingt ein guter Grund, nützliche Funktionen aufzugeben, aber es ist der Grund, warum ich versuche, einige der kryptischen Abkürzungen zu vermeiden, die in verschiedenen Sprachen beliebt sind. Beim Schreiben in tcsh habe ich nicht die Möglichkeit, so viele Abkürzungen zu verwenden, daher müssen komplexe Zeichenfolgenoperationen mit einfachen Unix-Tools und nicht mit integrierten Abkürzungen durchgeführt werden. Ich glaube, dass es zu Code führt, der leichter zu lesen ist, und das macht einen großen Unterschied für zukünftige Mitwirkende – und für zukünftiges, vergessliches ich .
Integrierte Mathematik
Eines der Dinge, die ich an tcsh liebe, ist das eingebaute @ mathematische Abkürzung. Wie die meisten autodidaktischen Unix-Benutzer bin ich über bc gestolpert und habe es seitdem bereut. Ohne eigenes Verschulden wird bc den Benutzern oft als Befehlszeilenrechner beigebracht, obwohl es eigentlich besser als Sprache für Berechnungen geeignet ist . Problemumgehungen umfassen einen erstaunlichen 300-Zeilen-Rechner in reiner Bash oder das let Befehl in Bash oder das @ Befehl in tcsh.
> @ n = ( 1 + 1 / 2 )
> echo $n
1
Für sehr komplexe Mathematik kann es sich lohnen, bc oder eine gute Python-Mathematikbibliothek zu lernen.
Alles Wesentliche
Für mich schafft tcsh eine perfekte Balance zwischen schlichter Einfachheit und wesentlichen Funktionen. Es ist keine Shell für alle Benutzer oder sogar für alle Zwecke, aber wenn Sie Ihre Sicht auf Ihre textbasierte Welt vereinfachen möchten, könnte tcsh eine interessante Alternative darstellen.