Heb je stilgestaan bij het openen van de terminal die je nu opent? Wat we kunnen stellen is dat Bash de standaard is in de wereld van Linux en voldoet aan wat je zou verwachten van een shell. Alleen de wereld van Linux zou de wereld van Linux niet zijn als je geen keuze zou hebben om een andere shell te kiezen. Tcsh is een van de shells waaruit je kunt kiezen en waar wat dieper op in gegaan wordt.

Auteur: Paul Reemeijer   |   Gepubliceerd in Linux Magazine 2021 – 3

Een Unix-shell is zowel een opdrachtinterpreter als een programmeertaal. Een shell maakt uitvoering van GNU-commando’s mogelijk of deze te combineren in de programmeertaal waardoor je taken automatiseert. Het uitvoeren van commando’s is essentieel, maar de kracht van shells is de ingebedde programmeertaal. Dit laatste is van belang om te onthouden bij het in gebruik nemen van een nieuwe shell. Bedenk dat specifieke shells en de daarbij behorende programmeertaal mogelijk incompatibel is met andere systemen.

Er zijn nogal wat shells beschikbaar voor Linux distributies. De bekendere, naast bash, zijn bijvoorbeeld ksh, zsh, ash en waar we het verder over gaan hebben in dit artikel: tcsh.

Op de wikipagina is een overzicht te vinden van de shells die beschikbaar zijn met een aantal vergelijkingen op onderwerpen zoals of er gebruik gemaakt kan worden van opstart scripts en waar deze worden verwacht.

Csh heeft een lange geschiedenis met het doel om meer te lijken op de programmeertaal C waarin het unix-systeem bijna uitsluitend in is geschreven. Tcsh is een verbeterde versie van csh waar de “t” komt van de “T” van het besturingsysteem TENEX.

Installeren TCSH

De meeste Linux distributies hebben tcsh in hun eigen, standaard repositories staan en hierdoor is het eenvoudig om tcsh op je machine te plaatsen. Voor Debian / Ubuntu installeer je tcsh door

> sudo apt install csh

Voor Fedora gebruik je het volgende commando:

> sudo dnf install tcsh

en voor (open)SUSE gebruik je het commando:

> sudo zypper in tcsh

Om gebruik te maken van tcsh is het niet noodzakelijk om Bash direct te vervangen, maar start je de omgeving, na het openen van je standaard terminal shell door het commando

> tcsh

Je prompt verandert en je bent klaar om gebruik te maken van, in dit geval, tcsh.

Ben je gewend aan tcsh of heb je zelf onderzoek gedaan naar verschillende shells? En heb je besloten om standaard deze te gebruiken het inloggen op TTY of bij het openen van je terminal applicatie? Dan is het volgende stappenplan bruikbaar. Ik laat zien hoe je aan de hand van tcsh deze standaard kunt instellen. Eerst zoek je naar waar tcsh is geïnstalleerd door het commando “which” of “whereis”.

>which tcsh

 

Dan krijg je het volgende terug: ‘/usr/bin/tcsh’

Met het whereis commando krijg je meer informatie terug. Je krijgt dan te zien waar de binary zich bevindt, de source van tcsh en de manpage bestanden.

> whereis tcsh
> tcsh: /usr/bin/tcsh /bin/tcsh /usr/share/tcsh /usr/share/man/man1/tcsh.1.gz

De volgende stap is om de standaard shell te wijzigen met het commando “chsh”.

paul@linux:~> chsh
Password:
Changing the login shell for paul
Enter the new value, or press ENTER for the default
        Login Shell [/bin/bash]:
Een overzicht van de config-bestanden.

Opvolger van csh

Zoals je eerder hebt gelezen is tcsh een verbetering op csh. Command-completion van TENEX is daarbij de start geweest voor tcsh. Maar dit is niet het enige waar de toegevoegde waarde zit in tcsh ten opzichte van csh. Wat er nog meer aan toegevoegd is zijn de volgende onderdelen:

* Commandoregel-editor
* Voltooiing en vermelding
* Spellingcorrectie
* Editor-opdrachten

In het artikel gaan we een aantal van deze toevoegingen bespreken waarbij ik de spellingcorrectie van een commando erg ben gaan waarderen.

Het eerste wat me opvalt, na het starten van tcsh, is het standaard gedrag van de prompt. De prompt ziet er in vergelijking met een standaard Bash prompt anders uit en laat niet het volledige pad zien waar ik mij bevind in het bestandssysteem. Pwd werkt en door te navigeren naar een andere directory met behulp van het commando cd vertelt de shell mij direct waar ik mij bevind. Hoe pas je dit aan?

Afbeelding 1: Login cshrc homefolder

Configuratie

Net als voor BASH zijn er configuratiebestanden waarin je persoonlijke en globale aanpassingen doet voor je gekozen shell. Door middel van het voorbeeld hierboven over de prompt, raken we stapsgewijs de verschillende, niet alle, configuratiebestanden aan die worden gebruikt voor tcsh.

Op mijn machine zijn wel de globale configuraties beschikbaar, maar de persoonlijke configuratiebestanden niet. Ik vermoed dat dit komt door dat ik pas na de installatie en aanmaken van mijn account tsch heb geïnstalleerd. Bij de controle van de op mijn aanwezige machine etc/skel directory staan ook hier de bestanden niet die nodig zijn voor een persoonlijke tcsh configuratie. Dit is niet erg, maar hou er rekening mee dat de mogelijkheid bestaat dat je nieuwe bestanden moet aanmaken voor je persoonlijke configuratie.

Zoals je waarschijnlijk wel weet staan je persoonlijke gebruikersaccount configuraties in de “dotbestanden” onder je home map. De twee bestanden die hier specifiek over gaan zijn .cshrc en .login.

Bij het wijzigen van je persoonlijke configuratie in de bestanden .cshrc en .login is het fijner om niet bij iedere wijziging de terminal af te sluiten en opnieuw te starten bij een wijziging. Om niet telkens opnieuw te hoeven inloggen op een interactieve shell kun je het commando source gebruiken. Als je twijfelt dat de wijziging wordt doorgevoerd of je hebt een wijziging gedaan die niet opgepakt lijkt te worden, zit er niets anders op dan een nieuwe terminal te open. Het gebruik van source gaat als volgt en pas je alleen toe op het configuratiebestand dat je hebt gewijzigd.

> source .cshrc of
> source .login

Het volledige pad tonen op de prompt. Open .cshrc in je favoriete editor en zet het volgende in het de configuratie bestand onder je home map (cd ~)

    if ($?prompt) then
        set prompt = "%/> "
    endif

Het if -statement test of de promptvariabele een waarde heeft, om onderscheid te maken tussen interactieve en niet-interactieve shells.

We hebben de lokale, persoonlijke configuratiebestanden kort aangehaald. Dezelfde vorm bestaat tevens globaal. De globale bestanden csh.cshrc en csh.login staan in de etc directory.

Om de standaard niet zomaar te overschrijven en om ervoor te zorgen dat je je globale wijzigingen niet kwijt raakt bij een update van het pakket, beginnen beide bestanden met een waarschuwing hierover en is bijvoorbeeld in csh.login het volgende opgenomen, zodat je persoonlijke globale wijzigingen hierin geplaatst worden.

# Local configuration
if ( -r /etc/csh.login.local ) source /etc/csh.login.local

Waar ik verder niet op in zal gaan zijn de optionele bestanden .logout in je persoonlijke home map of het bestand $HOME/.csh.expert om veel meer in eigen hand te hebben in plaats van afhankelijk te zijn van globale opgelegde instellingen voor tcsh.

Wat is er anders?

De interactieve shell voelt zeker niet onwennig of geheel nieuw. De standaard tools werken. Het gebruik van de tools ps, vim of het navigeren met het command cd voelt waarschijnlijk niet anders voor je.

Wat wel opvalt is het verkeerd typen van het commando. Er is een heuse spellingcorrectie actief. Gewoon een ‘Bedoel je niet…’  van een zoekmachine. Probeer het zelf eens door het volgende te typen:

> ci .login

Je krijgt dan de volgende vraag te zien: CORRECT> vi .login (y|n|e|a)?

De bedoeling is hier inderdaad om vi (of vim) te openen en door y te geven wordt netjes mijn editor met het opgegeven bestand getoond.

Het beantwoorden van CORRECT kan met y en n. Deze spreken voor zich Yes (Ja) of No (Nee). De ‘e’ laat het commando staan wat je hebt opgegeven en deze wordt uitgevoerd. De ‘a’ staat voor abort en stopt alles net alsof je een ^C uitvoert.

Scripting

Het schrijven en een script in tcsh is niet veel moeilijker dan in bash. Het is alleen net anders. Het is onmogelijk om alles in dit artikel te bespreken maar haal een aantal kleine voorbeelden aan om naar te kijken. Het eerste wat ik hierover meldt is dat het set commando wordt gebruikt om variabelen te zetten en een dollar teken als je er naar verwijst.

Voor het schrijven van scripts met tcsh die je (uiteindelijk) zou willen verspreiden is het van belang om goed te begrijpen dat niet iedereen tcsh geïnstalleerd heeft staan waardoor het mogelijk niet uitvoerbaar is voor de ander.

Als eerste de welbekende array maak je op de volgende manier:

> set mijnarray = ( Welkom bij het Linux Magazine )

Om een onderdeel van deze array te printen voer je het volgende uit:

> echo $mijnarray[4]

Je ziet nu het woord Linux op je scherm.

Het maken van een simpele berekening:

> set num1 = 40
> set num2 = 87
> @ tot = ( $num1 + $num2 )
> echo $tot

De uitvoer die je hoort te zien is 127.

Belangrijk bij het @ teken is dat er een spatie staat voordat je tot typt. Je krijgt anders een foutmelding “Badly placed ()’s.”.

Bij het in gebruik nemen van tcsh ga je tegen onverklaarbare foutmeldingen lopen door op een verkeerd moment wel of niet de spatie op de juiste manier te hebben toegepast. In mijn zoektocht hiernaar kwam ik deze klacht veelvuldig tegen met de daarbij onvolledige of niet duidelijke foutmelding die je op je scherm verschijnt.

Zoals bijna bij iedere andere taal aanwezig is heeft tcsh de volgende gestructureerde opdrachten:

* if-then-else
* foreach
* while
* switch

Wat ik als laatste wil laten zien, is het uitvoeren van tests die betrekking hebben op bestanden en mappen. Is er een specifieke map en/of bestand aanwezig en hang hier consequenties aan. Denk bijvoorbeeld aan een op maat gemaakte foutmelding.

#!/bin/tcsh
if (-d $HOME) then
  echo "Je HOME directory bestaat.”
endif
if (-f $HOME/test) then
  echo "Het test bestand bestaat."
else
  echo "Het test bestand bestaat niet."
endif

Voer het uit door dit voorbeeld op te slaan en het bestand execute of wel uitvoerrechten toe te kennen. Uitvoer rechten toebedelen aan het bestand doe je als volgt voor de gebruikersaccount:

>chmod u+x [bestandsnaam]

en voer je het uit met het commando:

> ./[bestandsnaam]

Tot slot

Ik ga geen conclusie schrijven over of je tcsh wel of niet moet gaan gebruiken. Het is goed dat er voldoende hoeveelheid keuze is in de wereld van shells. Je merkt, in de zoektocht naar informatie, dat bash veelvuldig gebruikt wordt en er veel, heel veel informatie te vinden over deze shell en programmeertaal. Met het artikel hoop ik dat je interesse is gewerkt om te kijken naar tcsh of een andere shell die beschikbaar is binnen je gekozen distributie.

Externe links

* https://www.tcsh.org/

* https://github.com/tcsh-org/tcsh

* https://bugs.astron.com/my_view_page.php