Mester Linux-kommandolinjen: Lær å bruke historiekommandoen!

Linux-skallet registrerer en logg over alle kommandoene du utfører, noe som gir deg muligheten til å søke gjennom og gjenta tidligere brukte kommandoer. Forståelsen av hvordan du benytter deg av Linux sin historikkfunksjon kan føre til en betydelig økning i din arbeidsproduktivitet.

Historikkmanipulasjon

Som George Santayana en gang sa: «De som ikke husker fortiden, er dømt til å gjenta den.» I Linux-sammenheng betyr dette at hvis du ikke har tilgang til din tidligere kommandoer, kan du ikke gjenta dem, selv om du skulle ønske det.

Her kommer Linux sin `history`-kommando inn. Den lar deg enkelt bla gjennom og gjenta tidligere kommandoer. Dette er ikke kun for å spare tid, men også for å forbedre nøyaktigheten. Jo lengre og mer komplisert en kommando er, jo vanskeligere er den å huske og skrive feilfritt. Feil kan forhindre kommandoen fra å fungere eller, enda verre, få den til å gjøre noe uventet.

`history`-kommandoen eliminerer disse problemene. Som de fleste Linux-kommandoer, er det mer til den enn man kanskje tror. Ved å lære å bruke `history` effektivt, kan du forbedre din daglige bruk av Linux-kommandolinjen. Det er en investering av tid som vil lønne seg, og det finnes langt mer effektive måter å bruke den på enn å bare trykke på opp-pilen gjentatte ganger.

Grunnleggende bruk av `history`-kommandoen

Den enkleste måten å bruke `history`-kommandoen på er ved å skrive inn `history` i terminalen:

history

Dette vil vise en liste over dine tidligere brukte kommandoer i terminalvinduet.

Kommandoene er nummerert, med de sist brukte (høyeste tall) på slutten av listen.

For å se et spesifikt antall kommandoer, kan du angi et tall etter kommandoen. For eksempel, for å se de siste 10 kommandoene, skriver du:

history 10

Du kan oppnå det samme resultatet ved å bruke `tail`-kommandoen:

history | tail -n 10

Gjenta kommandoer fra historikken

For å gjenbruke en kommando fra historikklisten, skriver du et utropstegn `!` etterfulgt av nummeret til kommandoen (uten mellomrom). For eksempel, for å gjenta kommando nummer 37, skriver du:

!37

For å gjenta den sist brukte kommandoen, skriver du to utropstegn (!!) uten mellomrom:

!!

Dette er spesielt nyttig hvis du har glemt å bruke `sudo` i en kommando. Skriv `sudo`, ett mellomrom, og deretter `!!`, og trykk Enter.

For eksempel, hvis vi utfører en kommando som krever `sudo`, men glemmer det, kan vi enkelt skrive `sudo !!` i stedet for å skrive hele kommandoen på nytt:

mv ./my_script.sh /usr/local/bin/
sudo !!

I tillegg til å bruke nummer for å gjenta kommandoer, kan du også bruke et negativt tall. For å gjenta den 13. forrige kommandoen, skriver du:

!-13

Søk etter kommandoer

For å gjenta den siste kommandoen som starter med en bestemt tekststreng, skriver du et utropstegn etterfulgt av strengen. For eksempel, for å gjenta den siste kommandoen som startet med `sudo`, skriver du:

!sudo

Vær forsiktig ved bruk av denne metoden, da du risikerer å utføre feil kommando hvis den sist brukte kommandoen ikke er den du forventer.

Du kan bruke modifikatoren `:p` (print) for å unngå feil. Dette vil vise kommandoen i terminalen uten å utføre den:

!sudo:p

For å finne en kommando som inneholder en bestemt tekst, bruker du et utropstegn og et spørsmålstegn. For eksempel for å finne den første kommandoen som inneholder `aliases`, skriver du:

!?aliases

Dette vil søke gjennom alle kommandoer som inneholder `aliases`.

Interaktivt søk

Et interaktivt søk lar deg søke gjennom kommandoer og gjenta den du ønsker. Trykk `Ctrl+r` for å starte søket:

Når du skriver inn teksten du søker etter, vises den første kommandoen som matcher. Teksten vises mellom backticks (`) og apostrofer (`’`). Kommandoene oppdateres etterhvert som du skriver inn hver bokstav.

Hver gang du trykker `Ctrl+r` vil du søke bakover i listen etter neste samsvarende kommando.

Når du trykker Enter, vil den viste kommandoen utføres.

For å redigere en kommando før du utfører den, trykker du på venstre eller høyre piltast.

Kommandoen vises på kommandolinjen der du kan redigere den.

Du kan også bruke andre Linux-verktøy, for eksempel `grep`, for å søke gjennom historikklisten. For å finne kommandoer som inneholder `aliases`, kan du bruke:

history | grep aliases

Endre siste kommando

For å rette opp en skrivefeil og gjenta kommandoen, kan du bruke `^`-tegnet. Dette er spesielt nyttig for å endre feilstavede ord eller endre kommandoalternativer.

Skriv `^`, teksten du vil bytte ut, en ny `^`, teksten du vil erstatte med, og en siste `^`, og trykk Enter. For eksempel, hvis du skrev inn `sudo systemctl start shhd`, kan du rette dette ved å skrive:

^shhd^sshd^

Kommandoen vil da bli utført med `shhd` erstattet av `sshd`.

Slette kommandoer fra historikken

Du kan også slette kommandoer fra historikklisten ved hjelp av `-d`-alternativet. Bruk `grep` for å finne kommandoen du vil slette, og bruk nummeret med `history -d`. Slik sikrer du at den er slettet:

history | grep shhd
history -d 83
history | grep shhd

Du kan også bruke et område med kommandonummer for å slette flere kommandoer samtidig. For å slette kommandoene 22 til 32 (inkludert), skriver du:

history -d 22 32

For å slette de siste fem kommandoene skriver du:

history -d -5

Manuell oppdatering av historikkfilen

Når du logger inn eller åpner et terminalvindu, blir historikken lastet inn fra en fil, vanligvis `.bash_history` i Bash. Endringer du gjør i historikken skrives kun til filen når du lukker terminalvinduet eller logger ut.

Dersom du vil at endringene i historikken skal være tilgjengelige i et annet terminalvindu før du lukker det første, kan du bruke `-a`-alternativet. Skriv følgende i det første terminalvinduet:

history -a

Dette vil oppdatere historikkfilen. For å tvinge alle endringer til historikkfilen (for eksempel slettede kommandoer), kan du bruke `-w`-alternativet:

history -w

Tømme historikklisten

For å slette alle kommandoer fra historikklisten, bruker du `-c`-alternativet:

history -c

Hvis du også vil tømme historikkfilen, bruker du `-w`-alternativet i tillegg:

history -w

Sikkerhet og historikkfilen

Vær oppmerksom på at kommandoer med sensitiv informasjon, som passord, lagres i historikkfilen. Hvis du ikke ønsker å lagre sensitiv informasjon, kan du bruke følgende struktur for å slette den umiddelbart:

special-app my-secret-password;history -d $(history 1)
history 5

Denne strukturen består av to kommandoer atskilt med et semikolon (;). Kommandoen `special-app my-secret-password` utfører den faktiske handlingen, mens `history -d $(history 1)` sletter kommandoen fra historikken.

En enklere metode er å legge til et mellomrom foran kommandoen. Bash vil da ignorere linjen og ikke legge den til i historikken:

 special-app another-password
history 5

Dette fungerer fordi linjer som starter med mellomrom ignoreres som standard i `.bashrc` filen.

Konfigurering av historikk med `.bashrc`

`.bashrc`-filen kjøres hver gang du logger inn eller åpner et terminalvindu. Den inneholder også verdier som styrer hvordan `history`-kommandoen oppfører seg. Åpne filen med gedit:

gedit .bashrc

Nær toppen av filen finner du to oppføringer:

  • `HISTSIZE`: Maksimalt antall oppføringer historikklisten kan inneholde.
  • `HISTFILESIZE`: Antall linjer en historikkfil kan inneholde.

Disse to verdiene samhandler på følgende måter:

  • Når du logger inn eller starter et terminalvindu, fylles historikklisten med innholdet fra `.bash_history` filen.
  • Når du lukker et terminalvindu, lagres det maksimale antallet kommandoer satt i `HISTSIZE` i `.bash_history` filen.
  • Dersom `histappend` er aktivert, vil kommandoene legges til `.bash_history`, hvis ikke vil `.bash_history` bli overskrevet.
  • Etter å ha lagret kommandoene, vil filen kuttes slik at den ikke overstiger `HISTFILESIZE` linjer.

Du finner også `HISTCONTROL` verdien:

Du kan angi denne verdien til:

  • `ignorespaces`: Linjer som begynner med et mellomrom, legges ikke til i historikklisten.
  • `ignoredups`: Dupliserte kommandoer legges ikke til i historikkfilen.
  • `ignoreboth`: Aktiverer begge de ovennevnte.

Du kan også spesifisere kommandoer som ikke skal legges til i historikken. Legg dem inn i anførselstegn og skill dem med et kolon (:):

export HISTIGNORE="ls:history"

Tidsstempler

For å legge til tidsstempler i historikklisten, bruk `HISTTIMEFORMAT` innstillingen. Legg til en linje som denne i `.bashrc`-filen:

export HISTTIMEFORMAT="%c "

Husk mellomrommet før anførselstegnet, dette forhindrer tidsstempelet fra å overlappe kommandoen.

Når du kjører `history` vil du nå se tidsstempler. Vær oppmerksom på at kommandoer som var i listen før tidsstemplene ble lagt til, vil bli stemplet med tiden for den første kommandoen som mottar et tidsstempel.

Dette er et veldig langt tidsstempel. Du kan bruke andre formateringsalternativer for å endre det. Disse inkluderer:

  • %d: Dag
  • %m: Måned
  • %y: År
  • %H: Time
  • %M: Minutter
  • %S: Sekunder
  • %F: Full dato (år-måned-dag-format)
  • %T: Tid (time:minutter:sekunder-format)
  • %c: Fullstendig dato- og tidsstempel (formaterer dag-dato-måned-år og time:minutter:sekunder)

La oss teste noen andre alternativer:

export HISTTIMEFORMAT="%d %m %T "

Dette vil vise dag, måned og klokkeslett.

Hvis du fjerner dag og måned, vil den kun vise klokkeslett.

Endringer i `HISTTIMEFORMAT` påvirker hele historikklisten. Dette er mulig fordi tiden for hver kommando er lagret som antall sekunder siden Unix-epoken. `HISTTIMEFORMAT` angir kun formatet som brukes til å vise dette tallet på en lesbar måte. For eksempel:

export HISTTIMEFORMAT="%T "

Dette gir en mer oversiktlig utskrift:

Du kan også bruke historiekommandoen til revisjon. Å gå gjennom tidligere kommandoer kan hjelpe deg med å finne ut hva som kan ha forårsaket et problem.

Som i livet, kan du bruke `history`-kommandoen til å gjenoppleve gode tider og lære av feilene dine.