De Linux command-line, een plek die krachtig en snel is als je deze goed beheerst. Dit artikel gaat specifiek in op de Bash shell geschiedenis. Hoe maak je handig gebruik van deze geschiedenis, worden er een aantal tweaks besproken en kijken we naar een alternatief.

Paul Reemeijer

Bij het installeren van je favoriete Linux distributie is het zo goed als zeker dat de Bash je standaard  shell is. De Bash shell bevat out-of-the-box een geconfigureerde geschiedenis die bij het uitvoeren van een commando het uitgevoerde commando bijhoudt. Deze uitgevoerde commando’s worden opgeslagen binnen je persoonlijke home folder in het bestand .bash_history.

Standaardgebruik

Om je geschiedenis te bekijken maak je gebruik van het commando ‘history’ of open je het bestand .bash_history met je favoriete editor.

Om snel gebruik te maken van je commando geschiedenis zijn de volgende toetscombinaties beschikbaar:

Pijltje omhoog of Ctrl+p om het vorige commando naar voren te halen.

Pijltje omlaag of Ctrl+n om naar het volgende commando in de geschiedenis te gaan.

Ctrl+r om te zoeken in je geschiedenis door een gedeelte te typen.

Ctrl+o gebruik je om het gevonden commando direct uit te voeren.

Pijltje naar rechts zorgt er voor dat de gevonden geschiedenis entry niet uitgevoerd wordt en je deze bijvoorbeeld nog kan aanpassen voordat je hem uitvoert.

Ctrl+g zorgt er voor dat je de zoekfunctie verlaat en je een lege opdrachtregel voor je hebt.

Alt+r gebruik je als je het gevonden item hebt gewijzigd en deze weer wil terugdraaien.

Bij de uitvoer van het commando ‘history’ krijg je standaard al je geschiedenis te zien die je ooit hebt uitgevoerd binnen de Bash shell waarbij de volgorde van oud naar nieuw is met een nummer ervoor. Om specifieker te zoeken in je geschiedenis is, zoals menig ander commando dat veel uitvoer geeft, het gebruik van pipe naar grep gebruikelijk. De syntaxis ziet er dan als volgt uit:

  > history | grep [je zoek tekst]

Verder heb je de mogelijkheid om op andere manieren de output te manipuleren, zoals met head, tail of more bijvoorbeeld. Wil je af van je opgebouwde geschiedenis, heeft het commando ‘history’ hier een optie voor die daarvoor zorgt:

 > history -c

Nu is het tijd voor wat meer diepgang in de opties van de Bash shell geschiedenis. Als eerste wil ik je kennis laten maken met Bang, het uitroepteken. Bij het opvragen van je geschiedenis heb je gezien dat er een nummer voor staat. Het commando kun je nogmaals uitvoeren aan de hand van dit nummer. Hiervoor heb je de Bang nodig. Je plaatst op de prompt eerst een ! met het nummer dat in de geschiedenis staat voor het commando wat je nogmaals wilt uitvoeren. Het opgegeven nummer met uitroepteken zie je niet in de geschiedenis terug maar het uitgevoerde commando. Om je laatst uitgevoerde commando nogmaals te executeren is een dubbele !! voor handen.

De Bang heeft nog de optie om iets te wijzigen van je vorige commando. Anders gezegd – je kan iets uit het vorige commando vervangen door een andere string.

 > hwinfo --gfxcard --short

 > !!:s^gfxcard^cpu

Ook hierbij geldt dat je in je geschiedenis dan niet !!:s^gfxcard^cpu terug zal vinden maar hwinfo –cpu –short

Verder heeft Bang nog de optie om argumenten van het vorige commando over te nemen door !$ of het vorige commando alleen uit te printen door! :p

Tags

Het gebruik van Tags is ook mogelijk in combinatie met Bang. Het is wel gevoelig voor fouten. Als je het vraagteken vergeet zal je eerst weer je eigenlijke commando met de tag moeten opzoeken in de geschiedenis. Tevens kan de tag zomaar uit de geschiedenis verdwijnen vanwege het maximaal aantal entries die worden bijgehouden in de geschiedenis van Bash shell.

Een voorbeeld van het gebruik van tags en het opnieuw uitvoeren door middel van deze tag doe ik aan de hand van een Bash Oneliner van de website www.bashoneliners.com maar wel aangepast op mijn hardware en met de toevoeging van de tag #ShowWifiSorted. De output dat het commando mij geeft zet ik er niet bij vanwege privacy behalve de eerste paar karakters.

lnxlenpr:~ # iw dev wlp3s0 scan | egrep "SSID|signal" | awk -F ":" '{print $2}' | sed 'N;s/\n/:/' | sort #ShowWifiSorted

-49.00 dBm: [..]

lnxlenpr:~ # !? #ShowWifiSorted 
iw dev wlp3s0 scan | egrep "SSID|signal" | awk -F ":" '{print $2}' | sed 'N;s/\n/:/' | sort #ShowWifiSorted 

-52.00 dBm: [..]

Je zou ook er voor kunnen kiezen om Alias te gebruiken. Dit zal je voor jezelf moeten bepalen.

Tweaks

Nog enkele leuke tweaks voor je om meer uit de Bash shell geschiedenis te halen en om je op weg te helpen met wat er allemaal mogelijk is.Voor het toevoegen van een datum en tijd bij het opvragen van je geschiedenis met het commando history pas je de volgende setting toe:

 $ export HISTTIMEFORMAT=’%F %T ’

De spatie na de letter T staat er bewust. Dit zorgt er voor dat de tijd en het commando niet aan elkaar geplakt worden bij het tonen van de geschiedenis.

Ben je benieuwd hoeveel uitgevoerde commando’s er wordt bijgehouden?

Voer het volgende commando uit

 > echo $HISTSIZE

Wil je deze groter of juist kleiner hebben, voer je het volgende commando uit:

 > HISTSIZE=[gewenst aantal]

Geschiedenis is erg fijn maar soms wil je gewoon niet dat een bepaald commando wordt toegevoegd aan je geschiedenis. Hier zijn verschillende opties voor maar ik bespreek er hier één die er voor zorgt dat als je het commando met een spatie begint, deze wordt genegeerd door het geschiedenis mechanisme. Voer hiervoor het volgende uit:

 > export HISTCONTROL=$HISTCONTROL:ignorespace

Het kan ook zomaar zijn dat je gekozen Linux distributie dit al voor je heeft geconfigureerd. Bij SUSE Tumbleweed is het bijvoorbeeld al via het configuratie bestand /etc/bash.bashrc geactiveerd. Test het dus eerst uit op je geïnstalleerde, gekozen distributie. Dit verschilt echt per distributie.

Er zijn hier een aantal tweaks besproken die na het sluiten van je terminal zijn verdwenen. Om de instellingen permanent te maken zorg je dat het op de volgende manier wordt geëffectueerd bij het opnieuw starten van je machine of terminal.

  • Open in je home folder het bestand .bashrc
  • Voeg de export regel toe van de aanpassing die je graag wilt blijven gebruiken
  • Sla het bestand op en open een nieuwe terminal om te kijken of dat het goed werkt.

Alternatieven

Er zijn alternatieven of aanvullingen beschikbaar voor de Bash shell geschiedenis zoals Keep, Bashpast, Pet en ik heb voor dit artikel gekozen om te gaat testen met Advanced Shell History, afgekort ASH. De code voor de applicatie is te vinden op Github via deze link.

De installatie van ASH ga ik verder niet doorlopen. Deze is goed gedocumenteerd op Github. Wel werkte het niet direct correct en heb ik de debug optie aangezet waardoor ik erachter kwam dat hij de query’s zorgt onder ‘/etc/ash/’ die niet bestond.

Het aanzetten van de debug doe je als volgt, na de installatie:

Open ‘/usr/local/etc/advanced-shell-history/config’en zoek naar de optie ASH_CFG_LOG_LEVEL en zet deze op DEBUG. Dit geeft je veel informatie over wat er nu mis gaat als het niet correct werkt na installatie. Let wel de ‘history’ opvragen via de eerder genoemde oplossingen werkt maar dan niet meer zoals je zou verwachten door wat vertroebeling.

Bij het juist activeren van ASH zie je dit direct in je geopende terminal. Bij het openen van je terminal zie je dan namelijk de melding: “Advanced Shell History enabled: Session n” waarbij n staat voor het nummer van welke sessie het hier betreft.


Wat is er nu veranderd?

De geschiedenis wordt opgeslagen per sessie in een SQLite database. Het opvragen van de geschiedenis is geconfigureerd door middel van query’s in het gelijknamige bestand waarin je je eigen query’s ook aan kan toevoegen. Er worden er vier standaard meegeleverd waarmee je direct mee aan de slag kan, zie screenshot.


Wat een leuke feature is van deze tool is dat de exit code bij het commando wordt opgeslagen. Je weet dus of een commando geslaagd is of niet en met welke exit code.

Tot slot

Nu je een beeld hebt van wat de Bash shell geschiedenis voor je kan betekenen is het gebruik van de terminal weer een klein beetje effectiever en daardoor ook leuker. Er is nog veel meer mogelijk met de Bang (het uitroepteken) of met het zoeken en hergebruiken van je geschiedenis. Happy hacking met het optimaliseren van je Bash shell geschiedenis!