Bijna elke developer komt zo nu en dan in aanraking met de terminal. Hoewel dit niet vervelend hoeft te zijn is het vaak een obstakel dat je moet overwinnen voordat je echt aan de slag kunt. Ik ben zo’n gek die geen genoeg kan krijgen van de terminal. In dit blog deel ik graag wat tips en trucs om jouw ervaring ook te verbeteren. Deze week: je commandogeschiedenis gebruiken om minder te hoeven typen en sneller te werken.
Level 0: Pijltje omhoog
Als ooit in je leven een terminal hebt aangeraakt weet je hopelijk dat je de pijltje omhoog-toets kunt gebruiken om je eerder ingevoerde commando’s terug te halen. Niet alleen je laatste commando, maar ook alle commando’s ervoor. Bij mij ziet dit er vaak zo uit:
$ edit script.py
$ python script.py
$ edit script.py
$ python script.py
$ edit script.py
$ python script.py
...
Tot eindelijk alle bugs er uit zijn. Scheelt al een hoop typen, maar er is nog veel meer mogelijk.
Level 1: Ctrl + R
Doe me een lol en open nu een terminal, duw Ctrl + R
in, en type het begin van een commando dat je vaak gebruikt, bijvoorbeeld cd
, ssh
, of git
. Met Ctrl + R
, reverse incremental search, kun je namelijk zoeken in je geschiedenis. Ooit een of ander ingewikkeld commando gebruikt met allemaal flags, maar je weet niet meer wat precies, en het is te lang geleden om er met pijltje omhoog naartoe te scrollen? Ctrl + R
is je redder.
Nog niet overtuigd? Ga terug naar je terminal, duw op Ctrl + R
, voer je zoekopdracht in, en druk nogmaals op Ctrl + R
. Je zoekt nu verder terug in je geschiedenis met dezelfde zoekopdracht. Met Ctrl + S
kun je weer de andere kant op zoeken.*
* Misschien moet je eerst stty -ixon
doen om Ctrl + S te
gebruiken. Op sommige systemen werkt Ctrl + Shift + R
.
Intermezzo: geschiedenislimiet verhogen
Het zou kunnen dat je niet alles terug kunt vinden wat je verwacht en het zou kunnen dat dit komt doordat je geschiedenis maar beperkt wordt opgeslagen. Om verder terug in je geschiedenis te kunnen zoeken, kun je de limiet verhogen door je ~/.bashrc bestand als volgt aan te passen:
HISTSIZE=1000000
HISTFILESIZE=1000000
Level 2: history | grep
Jij bent een echte terminaltijger die nog meer wil, ik voel het. Want wat als je echt nog maar heel vaag weet hoe je commando er uitzag? Of wat als je meerdere opties tegelijk wil zien? Goed dan, we gaan nog geavanceerder zoeken met grep
.
Met het commando history
print je je hele commadogeschiedenis naar de terminal. Met | stuur je deze geschiedenis naar grep
. Met history | grep 'git'
krijg je bijvoorbeeld alle commando’s met git erin te zien. Je kunt ook zoeken op een regular expression met grep -E
. Standaard interpreteert grep
je zoekopdracht al deels als een regular expression. Wil je dit niet? Gebruik grep -F
.
Als grep
je lievelingscommando heeft teruggevonden kun je het natuurlijk overtypen of zelfs kopiëren, maar er is een nog betere manier. Het history
commando geeft namelijk niet alleen oude commando’s, maar ook hoeveelste dit commando is in je geschiedenis. Hiermee kun je met !n in een keer je geliefde commando herhalen. Bijvoorbeeld zo:
$ history | tail -n 4
1313 echo "Wauw!"
1314 rm -rf / --no-preserve-root
1315 echo 'echo \'sleep 1\'' >> .bashrc
1316 history | tail -n 4
$ !1313
echo "Wauw!"
Wauw!
Intermezzo: hoofdletterongevoelige autocomplete met tab
Een andere truc om minder te typen die je waarschijnlijk al kent is autocomplete, oftewel de tab-toets. Waarschijnlijk ben je ook bekend met de frustratie dat het niet werkt als je hoofdletters niet kloppen, bijvoorbeeld als rm mai
niet wordt afgemaakt naar rm Main.java
. Die frustratie kun je nu in een paar seconden beëindigen met het volgende commando:
echo 'set completion-ignore-case On' | sudo tee -a /etc/inputrc
Nu werkt autocomplete ook als de hoofdletters niet overeenkomen.
Level 3: !
Nog steeds niet genoeg hè? Geen zorgen. Voor de echte terminaltitanen is er een verzameling nog onleesbaardere sneltoetsen. Zo kun je in plaats van pijltje omhoog ook !!
gebruiken om je laatste commando te herhalen. Bijkomend voordeel van deze methode is dat je !!
ook kunt invoegen op een willekeurige plek in een nieuw commando, bijvoorbeeld zo:
$ du -sh /
du: cannot read directory: Permission denied
$ sudo !!
Dit kan ook met commando’s verder terug in je geschiedenis met !-1
, !-2
, !-3
, etc. Handig als je een aantal opeenvolgende commando’s uit je geschiedenis steeds moet herhalen. Hierop kun je ook nog weer een tekstsubstitutie uitvoeren om het commando subtiel aan te passen. Daarmee zijn dit soort trucjes mogelijk.
$ cd DEV/
$ echo "we're programmers, we don't like windows" >> jokes.md
$ git commit -am "very important changes"
$ cd ..
$ !-4:s/DEV/PRD
cd PRD/
$ !-4
echo "we're programmers, we don't like windows" >> jokes.md
$ !-4
git commit -am "very important changes"
$ !-4
cd ..
Conclusie
Misschien vind je werken met de terminal nog steeds een vervelend klusje, maar ik hoop dat het met deze trucs in ieder geval een klein beetje aangenamer is geworden, of anders in ieder geval sneller. En ben je nog steeds niet verzadigd, neem dan eens een kijkje in man history
, daar staat uitgelegd hoe dit alles nou precies werkt en er staan zelfs nog meer sneltoetsen.