diff --git a/README.md b/README.md index 17bbedbab650196583f2ab4aad738e629fd31b57..842d49e1aa24fb35befac997fe18f6d2268ed491 100644 --- a/README.md +++ b/README.md @@ -8,9 +8,7 @@ Samtidig skal vi benytte anledningen til å bli bedre kjent med terminalen, som I denne lab'en skal vi modifisere et enkelt shell for å navigere filsystemet som er løst inspirert av *bash*. Kommandoene vi bruker vil også fungere omtrent på samme måte i zsh og PowerShell. -## Oversikt - -* [Bakgrunn: shell og terminal](#bakgrunn--shell-og-terminal) +* [Ordbok: shell og terminal](#ordbok--shell-og-terminal) * [Bli kjent med eksisterende kildekode](#bli-kjent-med-eksisterende-kildekode) * [Kjøre SimpleShell](#kjøre-simpleshell) * [Vis SimpleShell gjennom GUI](#vis-simpleshell-gjennom-gui) @@ -19,18 +17,19 @@ I denne lab'en skal vi modifisere et enkelt shell for å navigere filsystemet so * [Definere metoder i Command](#definere-metoder-i-command) * [Vår første kommando: echo](#vår-første-kommando--echo) * [Installere kommandoer i SimpleShell](#installere-kommandoer-i-simpleshell) -* [Frivillige forbedringer](#frivillige-forbedringer) +* [Anbefalte forbedringer](#anbefalte-forbedringer) * [exit: en annen enkel kommando](#exit--en-annen-enkel-kommando) * [pwd, cd og ls: kommandoer som trenger kontekst](#pwd--cd--og-ls--kommandoer-som-trenger-kontekst) * [man: kommando for å lese manualen](#man--kommando-for-å-lese-manualen) * [Trykk backspace for å fjerne bakerste bokstav i kommandoen](#trykk-backspace-for-å-fjerne-bakerste-bokstav-i-kommandoen) * [Starte Java-programmer fra SimpleShell](#starte-java-programmer-fra-simpleshell) +* [Flere frivillige forbedringer](#flere-frivillige-forbedringer) * [Forbedret ls: ls -l, ls -a, ls path/to/folder](#forbedret-ls--ls--l--ls--a--ls-pathtofolder) * [Flere kommandoer som trenger kontekst: touch, mkdir, cat, rm, mv, cp](#flere-kommandoer-som-trenger-kontekst--touch-mkdir-cat-rm-mv-cp) - * [grep: en bonus-utfordring](#grep--en-bonus-utfordring) + * [grep: søking i filer](#fgrep--søking-i-filer) -## Bakgrunn: shell og terminal +## Ordbok: shell og terminal Kjært barn har mange navn. Under lister vi opp noen synonymer til «terminal» med litt ulike opphav, og som har litt ulike konnotasjoner. I praksis bruker vi disse ordene litt om hverandre. * **Terminal**. Opprinnelig brukt om kombinasjonen av en fysisk skjerm og et tastatur. Disse kunne være et annet sted enn selve datamaskinen. I senere tid har begrepet blitt brukt om programmer som gir et grafisk brukergrensesnitt (et vindu) til et shell. En **konsoll** var en spesiell terminal som var en integrert del av datamaskinen, og som ikke kunne skilles fra den slik man kunne med andre terminaler. @@ -206,7 +205,9 @@ if (command != null) { ✅ Du er ferdig med den obligatoriske delen av laben når testen i `TestSimpleShellEcho` er aktivert og passerer (i tillegg til at testene i `TestCmdEcho`, `TestSimpleShell` og `TestTextAnswers` fremdeles passerer). -## Frivillige forbedringer +## Anbefalte forbedringer + +Forbedringene i dette avsnittet er frivillige med tanke på å bestå laben, men er sterkt anbefalt å prøve seg på. ### `exit`: en annen enkel kommando @@ -363,6 +364,10 @@ shell.installCommand(new CmdJavaProgram("new", Main.class)); Hva er det som skjer? +## Flere frivillige forbedringer + +Forbedringene under krever at du setter deg litt inn i `File` -klassen. Du kan lese litt om denne i [kursnotatene](https://inf101.ii.uib.no/notat/inputoutput/#filer) eller slå opp i den [offisielle dokumentasjonen](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/io/File.html). + ### Forbedret `ls`: `ls -l`, `ls -a`, `ls path/to/folder` I bash har kommandoen `ls` flere muligheter enn det vi så langt har laget. For eksempel: @@ -384,19 +389,23 @@ Det kan være en fin øvelse å gjenskape dette for vår `ls` -kommando. * `mv source target` endrer navn på filen eller mappen *source* til filnavnet/mappenavnet *target*. Dette kan innebære flytting hvis target er en sti til en annen mappe. Dersom *target* er en mappe som finnes fra før, flyttes *source* -filen/mappen til *target* -mappen og beholder sitt opprinnelige navn. * `cp source target` det samme som mv, men lager en kopi i stedet for å flytte. -### `grep`: en bonus-utfordring +### `fgrep`: søking i filer + +*Grep* og lillebroren *fgrep* er på mange måter *cat* med et søkefilter inkludert. Den skriver kun ut de linjene som har innhold som matcher søkeordet. Standard bruk: -Grep er på mange måter *cat* med inkludert filter. Den skriver kun ut de linjene som har innhold som matcher søkeordet. Standard bruk: +`fgrep searchword filename` -`grep searchword filename` +Vi anbefaler alle å bli kjent med hvordan grep/fgrep virker i bash. De ambisiøse kan også implementere det de klarer av fgrep til bruk i vårt eget SimpleShell: -Vi anbefaler alle å bli kjent med hvordan grep virker i shell som bash. De ambisiøse kan også implementere det de klarer av den til bruk i vårt eget SimpleShell. +* `fgrep searchword filename -n` viser linjenummer +* `fgrep searchword filename -i` ignorerer case, dvs søkeordet `abc` vil få treff på `aBC` +* `fgrep searchword filename -v` skriver ut alle linjene som *ikke* matcher søkeordet +* `fgrep searchword filename -c` skriver ut hvor mange linjer som matchet søkeordet +* `fgrep searchword *` kjører grep på alle filer i current working directory. Hvis kombinert med `-n` viser utskriften navnet på filen ut først, og så linjenummer i den filen. +* `fgrep searchword * -l` skriver kun ut navnet på filene med innhold som matcher, uten å skrive ut selve treffene +* `fgrep searchword * -L` skriver kun ut navnet på filene *uten* innhold som matcher +* `fgrep searchword foldername -r` kjører grep på alle filer i mappen *og* på alle filer i alle undermapper i uendelig dypde. -* `grep -i searchword filename` ignorerer case, dvs søkeordet `abc` vil få treff på `aBC` -* `grep -v searchword filename` skriver ut alle linjene som *ikke* matcher søkeordet -* `grep searchword foldername` kjører grep på alle filer i mappen. I utskriften skrives navnet på filen ut først, og så linjene i den filen. -* `grep -l searchword foldername` skriver kun ut navnet på filene med innhold som matcher, uten å skrive ut selve treffene -* `grep -L searchword foldername` skriver kun ut navnet på filene *uten* innhold som matcher -* `grep -r searchword foldername` kjører grep på alle filer i mappen *og* på alle filer i alle undermapper i uendelig dypde. +Flagg (delen av kommandoene som begynner med `-`) kan ofte kombineres, for eksempel vil `-ni` både vise linjenummer og ignorere case. Du trenger ikke håndtere søkeord som inneholder mellomrom i første omgang, det blir eventuelt en superbonusoppgave. -Prøv deg frem og sammenlign med hva som skjer i bash. Les mer om grep [her](https://www.opensourceforu.com/2012/06/beginners-guide-gnu-grep-basics/) eller en annen introduksjon [her](https://danielmiessler.com/study/grep/). +Prøv deg frem og sammenlign med hva som skjer i bash. Les mer om grep i introduksjonen til [ryanstutorials](https://ryanstutorials.net/linuxtutorial/grep.php), [opensourceforu](https://www.opensourceforu.com/2012/06/beginners-guide-gnu-grep-basics/) eller [danielmiessler](https://danielmiessler.com/study/grep/). diff --git a/src/main/java/no/uib/inf101/terminal/DummyShell.java b/src/main/java/no/uib/inf101/terminal/DummyShell.java index 6febc3712e5079835c7276e3cb8073314a3926ee..410328840f465fadb732f6e16e8dfe85c6123a73 100644 --- a/src/main/java/no/uib/inf101/terminal/DummyShell.java +++ b/src/main/java/no/uib/inf101/terminal/DummyShell.java @@ -11,12 +11,13 @@ public class DummyShell implements CommandLineInterface { private String screenContent = "$ "; @Override - public void keyPressed(char keyCode) { - if (keyCode == '\n') { + public void keyPressed(char key) { + if (key == '\n') { screenContent += "\n$ "; } else { - screenContent += keyCode; + screenContent += key; } + System.out.println((int) key); } @Override diff --git a/src/main/java/no/uib/inf101/terminal/EchoShell.java b/src/main/java/no/uib/inf101/terminal/EchoShell.java index deaddc0be25975efca8b6335508b4a1d1a422c22..3f61a444bd92732d3fd651d136c4028365216c58 100644 --- a/src/main/java/no/uib/inf101/terminal/EchoShell.java +++ b/src/main/java/no/uib/inf101/terminal/EchoShell.java @@ -13,13 +13,13 @@ public class EchoShell implements CommandLineInterface { String currentLine = ""; @Override - public void keyPressed(char keyCode) { - if (keyCode == '\n') { + public void keyPressed(char key) { + if (key == '\n') { outputLines.add("$ " + currentLine); outputLines.add("Oh, an echo! listen: " + currentLine); currentLine = ""; } else { - currentLine += keyCode; + currentLine += key; } } diff --git a/src/main/java/no/uib/inf101/terminal/SimpleShell.java b/src/main/java/no/uib/inf101/terminal/SimpleShell.java index f6e6f47b52ce292fddf90c28b508a509871792cf..85fb46deb6b2f099839ba6fbbabb98e6ab581ecc 100644 --- a/src/main/java/no/uib/inf101/terminal/SimpleShell.java +++ b/src/main/java/no/uib/inf101/terminal/SimpleShell.java @@ -60,6 +60,8 @@ public class SimpleShell { this.processCurrentCommandLine(); } else if (key >= ' ' && key <= '~') { this.currentCommand += key; + } else { + // Some special key was pressed (e.g. shift, ctrl), we ignore it } }