Göm menyn

TDP001 Handhavande av datormiljö

Terminalkommandon v39

Historik

Terminalen håller koll på alla kommandon vi skrivit tidigare! Under körning har bash koll på kommandon du kört denna gång och när bash stängs ner sparas hisotiken vanligen ner till filen ${HOME}/.bash_history. Inte nog med att vi kan se historiken, vi kan även komma åt (och köra) tidigare kommandon!

Alla försök att komma åt tidigare kommandon inleds med ett utropstecken.

Kommando    Betydelse
!n	    Utför kommando nummer n
!-n	    Utför det n senaste kommandot (!-1 betyder alltså förra)
!!	    Kortnamn för !-1
!string	    Utför det senaste kommandot som börjar med string
!?string    Utför det senaste kommandot som innehåller string

När man hittat ett visst kommando kan man plocka ut olika ord i det kommandot. Antag att du skrivit !! för att komma ut förra kommandot, lägg därefter till ett kolon för att komma åt ett (eller en grupp av) ord enligt nedanstående tabell:

Ord 	Betydelse
n	ord nummer n (indexeras från 0)
^	Ord 1 (dvs första argumentet till programmet)
$	Sista argumentet
%	Hela ordet som matchade string om den varianten användes
x-y	Alla ord i intervallet x-y (x kan utelämnas)
*	Alla argument till kommandot (dvs 1-$)
x*	Förkortning för x-$
x-	Förkortning för x-$ (men tar inte med $)
Kolonet kan utelämnas vid ^, $, % och *

Efter ordvalet kan man lägga till modifierare. Varje modifierare inleds med ett eget kolon:

Modifierare    Betydelse
:h	       Tag bort det sista filnamnet i hela raden
:t	       Tag bort samtliga filnamn
:r	       Tag bort filändelse 
:p	       Skriv endast ut kommandoraden (kör inte slutresultatet)
:s/old/new/[g] Byt ut ordet old mot new. Om g (global) anges byts samtliga old ut, annars endast den första förekomsten

Exempel (se hur det nya kommandot skrivs ut):

   $ echo 1 2 3 4 5 fil.py
   1 2 3 4 5 fil.py
   $ echo !!:1-
   echo 1 2 3 4 5
   1 2 3 4 5 
   $ echo !-2:$:r
   echo fil
   fil
   $ !!:s/fil/hej/:p
   echo hej

Ok, man kan ange ett historiknummer för att nå ett visst kommando, men hur vet jag vilket nummer ett visst kommando har? En enkel lösning är att köra kommandot history som ger en lista med de senaste kommandona. En annan lösning är att låta terminalen skriva ut kommandonumret för varje kommando...

Prompten

När terminalen står och väntar på att vi ska mata in något står det en text. Normalt sätt ser den ut på formatet "användarnamn@dator:nuvarande_mapp$ " Detta kallas för prompten. Det finns en variabel inbyggd i bash som heter PS1 som bestämmer utseendet på prompten. Denna variabel kan innehålla vilken text vi vill, men det finns speciella tecken som ger viss text, här beskrivs några (se rubriken PROMPTING i manualsidorna för bash för fler):

Tecken	       Betydelse
\h	       Datorns namn (hostname)
\u	       Användarnamn (username)
\W	       Nuvarande katalogs namn ($HOME blir till ~)
\!	       Nuvarande kommandos histriknummer
\[ XXX \]      Skriv ut icke-skrivbara tecken XXX (används exempelvis för att få färger)
\$     	       Ett dollartecken om du är vanlig användare, # om du har root-rättighet
Exempel:
  $ PS1='<\!> [\u@\h \W]\$ '
  <123> [eriel18@lille21 ~]$ 

Det finns flera webtjänster för att generera PS1-variabler. Tycker man att detta verkar intressant så finns det en väldigt djup genomgång om prompten på ArchLinux wiki

För att få dina ändringar sparade för senare terminaler kan du lägga in ändringen i filen ${HOME}/.bashrc Allt i den filen körs automatiskt när du startar en vanlig terminal.

Funktioner

Precis som i Python kan vi i bash skapa funktioner. Syntaxen är
 function name [()] {
  Kommandon
 }
eller
 name () {
  kommandon
 }
Vi kan alltså utelämna antingen function eller parenteserna, men inte båda (vi får självklart ha med båda, det brukar jag alltid göra).

Vanligen vill man skriva ut resultatet så att det kan skickas till senare kommandon med pipe som vanligt.

Vi markerar inte antal parametrar på något sätt, men vi kan skicka argument till funktioner och sedan komma åt dess värden.

Parameter   Beskrivning
$n	    Argument nummer n 
$@	    Alla argument, du vill troligen använda "$@" för att hantera mellanslag korrekt
$#	    Antal givna argument
Exempel
function ema() {
  emacs "$@" &
}
Nu har vi skapat en funktion som automatiskt lägger till ett &-tecken när vi startar emacs!
function my_name () {
 if [[ $# == 0 ]]
 then echo "eric" 
 else
  echo $1
 fi
}
 $ my_name
 eric
 $ echo Hi $(my_name)
 Hi eric
 $ echo Hi $(my_name emma)
 Hi emma
Som ni ser behöver vi inte anropa funktioner med parenteser utan de anropas precis som vanliga program.

Uppgift 1: Skapa en funktion som tar emot noll eller flera numeriska värden och skriver ut summan av dessa värden. Funktionen ska skriva ut 0 om inga tal anges.

Alias

Till slut har vi även alias i terminalen. Ett alias är ett annat namn för ett kommando. Skillnaden mellan alias och funktioner är att alias inte kan ta argument utan fungerar som ren utbyte av text. Formatet är simpelt:
alias my_alias='kommando'
När jag sedan skriver my_alias i början av ett kommando kommer detta bytas ut mot 'kommando'.

I er standardinstallation har ni redan ett antal alias satta, exempelvis

alias ll='ls -alF'
alias la='ls -A'
alias l='ls -CF'
Om man vill ta bort ett alias kan man köra kommandot unalias:
unalias l
Om man har ett alias men inte vill köra det just nu kan man använda backspace:
\la hej
Bash kommer då söka efter ett kommando med namn la precis som vanligt.

Tillsammans med min funktion ema ovan har jag aliaset emacs enligt nedan:

alias emacs=ema
Vilket tillsammans gör att när jag skriver exempelvis
    emacs fil1 "fil 2" 
kommer detta först ersättas med
    ema fil1 "fil 2"
för att sedan köra kommandot
    emacs "fil1" "fil 2" &
Observera att det endast är texten som vi själva skriver i terminalen som kan ersättas av alias.

Sidansvarig: Eric Elfving
Senast uppdaterad: 2016-08-02