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 historiknummer
\[ 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.

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.

Om jag till exempel inte skulle vilja skriva ssh ponha45@remote-und.ida.liu.se varje gång jag vill gå in via ssh på skolans datorer skulle jag kunna använda aliaset nedan:

alias sshida='ssh ponha45@remote-und.ida.liu.se'
Vilket gör att när jag skriver:
 sshida  
kommer detta ersättas med
  ssh ponha45@remote-und.ida.liu.se  
Observera att det endast är texten som vi själva skriver i terminalen som kan ersättas av alias.

Sidansvarig: Pontus Haglund
Senast uppdaterad: 2019-05-29