Bash history styring

BASH (Bourne Again SHell) er standarden i praktisk talt alle Linux-baserede operativsystemer. Alle de kommandoer, vi skriver i terminalen, fortolkes af en shell og bliver en del af dens historie. I denne tutorial ser vi, hvor shell-historikken er gemt, og hvordan man administrerer den ved hjælp af den indbyggede “historie”-kommando og nogle systemvariabler.

I denne vejledning vil du lære om:

  • Hvor og hvordan er BASH kommando historie gemt.
  • Hvordan man visualisere den aktive shell historie.
  • Hvordan man i BASH sletter alle kommandoer i historie filen.
  • Hvordan man i BASH laver en opdatering af bash history filen.
  • Hvordan man ændre BASH historie opførsel via environment variabler.
Styring af Bash historie

Software som skal bruges eller bliver brugt.

Softwarekrav og Linux-kommandolinje
Kategori Anvendte krav, konventioner eller softwareversion
System Distributions uafhængig
Software Bash shell
Andet Ingen
Conventions # – Kræver at en given linux-commands skal udføres af en root privileges enten som root bruger eller brug af sudo kommandoen.
$ – Kræver at en given linux-commands skal udføres som en normal bruger.

Hvor er BASH historie gemt?

Hvis vi åbner en terminal emulator, eller vi arbejder i en TTY, og vi ønsker at genkalde en kommando, vi har kørt tidligere, trykker vi normalt på den øverste piletast for at navigere tilbage eller på pil ned for at navigere frem i shell historikken. Har du nogensinde spekuleret på, hvor og hvordan Bash-historikken gemmes? Listen over kommandoer, vi kalder i Bash-shell, er gemt i den såkaldte “history fil”, som som standard er ~/.bash_profile.

Kommandoer er gemt en pr linje i historie filen, de sidste brugte kommandoer gemmen i memory og skrives først til filen når shell sessionen bliver lukket eller der bliver giver besked om en opdatering. (Vi kommer ind på det senere i denne guide).

Arbejde med “history” indbygget kommando.


For at vise indholdet at den nuværende shell historie, kan vi bruge history kommandoen, uden nogle argumenter. Som vist her:

$ history
    1  echo "linuxconfig.org"
    2  cat /etc/hostname
    3  ls -l /etc/hostname
    4  history

Oprydning af Bash shell-historien

The history kommandoen bruges ikke kun til at vise den. Den kan også andre operationer en vise bash historien. For at fjerne alle historie kommandoer fra bash kan du bruge -c parameteren.

Vi kan også fjerne en bestemt linje fra den med  -d  parameteren. Hvis vi eksempel vi hvis vil fjerne den første linje fra bash historie fra memory skrives kommandoen som vist her.

$ history -d 1

Negative tal kan bruges som offset: Hvis vi gør det, starter linjetællingen fra slutningen af listen. Hvis du for eksempel overfører -1 som offset til -d indstillingen, vil den sidste linje i historikken blive fjernet. Når vi udfører en sådan handling, skal der dog tages højde for én ting: Fjernelsen finder sted, efter at historikken -d kommandoen er tilføjet til selve listen, så for at slette den tredje linje fra slutningen af historikken burde vi faktisk køre historie -d -4. Som et alternativ kunne vi ændre vores konfiguration for at få nogle kommandoer som historik ikke med på listen. Vi kan gøre det ved at arbejde med HISTCONTROL eller HISTIGNORE variabler.

Skrivning af history filen manuelt.

Som vi allerede har nævnt, bliver historikken for den shell, vi i øjeblikket arbejder i, kun skrevet til historiefilen, når shell-sessionen er lukket. Hvad hvis vi ønsker at tvinge in-memory historie til at blive skrevet på et bestemt tidspunkt? Igen kan vi bruge historik kommandoen til at udføre en sådan handling. Denne gang skal vi bruge -w indstillingen, som ikke tager noget argument:

$ history -w

Ændre historie opførsel med environment variabler.


Måden på at shell-historikken kan ændres er ved at indstille værdien af nogle miljøvariabler. Lad os se nogle eksempler.

HISTCONTROL variable

Vi har talt lidt om HISTCONTROL variablen, hvor vi talt om hvilken type kommandoer som bliver gemt i history filen. Denne variable tager colon separeret “liste” af værdier som beskrive hvordan komandoerne er gemt. I de fleste distributioner bliver der brugt ignoredups:

$ echo $HISTCONTROL
ignoredups

hvad betyder det så ?. ignoredups beskriver at hvis den forrige kommando er identisk til den, bliver den ikke gemt i history filen. Hvis vi vil undgå dubletter i hele shell-historikken uanset hvilken position de har, kan vi bruge erasedups værdien i stedet for.

En anden brugt værdi som bliver brugt er ignorespace hvilken beskriver at alle kommandoer som starter med et space ” ” ikke skal gemmes i  shell-historikken. Lad os lave en ændring og check at det virker.

$ HISTCONTROL="ignoredups:ignorespace"
$  echo "Denne kommando vil ikke blive gemt i history."
"Denne kommando vil ikke blive gemt i history."
$  history
    1  HISTCONTROL="ignoredups:ignorespace"

Først ændret vi værdien for HISTCONTROL fra  “ignoredups” til “ignoredups:ignorespace”. Vi kunne også her bruge ignoreboth som betyder det samme. Efter vi har ændret HISTCONTROL kan du prøve med en history og du vil se er det kun variable HISTCONTROL=”ignoredups:ignorespace” som vises i history. da echo kommandoen starter med et space tegn.

Husk at det vi ændre her ikke ikke bliver gemt, efter du har lavet en logout. For at gemme disse ændringer skal du ændre shell environment filen.

The HISTIGNORE variable

Lige som HISTCONTROL variablen. Så bruges HISTIGNORE på samme måde med “:” som element separator. Men der beskrives hvilken kommandoer som IKKE skal med i shell history filen.

hvad betyder det så ?. Lad os sige vi vil ignorere ls og history kommandoen. Her er hvad vi skal skrive til HISTIGNORE

$ HISTIGNORE="ls:history"
$ echo "Dette vil blive gemt i history."
Dette vil blive gemt i history
$ ls
file.txt
$ history
    1  echo "Dette vil blive gemt i history"

 


Som du kan se efter vi har ændret værdien gemt i HISTIGNORE variablen, bliver kun echo kommandoen vist. Der er lige en ting at huske her. Hvis du havde brugt ls -l ville kommandoen blive gemt i history da det kun er ls som vi har givet som ignore kommando.

$ HISTIGNORE="ls:history"
$ echo "Dette vil blive gemt i history."
Dette vil blive gemt i history.
$ ls -l
-rw-rw-r--. 1 egdoc egdoc    0 Jan  7 11:51 file.txt
$ history
    1  echo "Dette vil blive gemt i history."
    2  ls -l

 

For at overkomme dette problem kan du bruge * som beskriver alt som kommer efter kommandoen. Vi skulle ændre for HISTIGNORE på denne måde:

$ HISTIGNORE="ls *:history"
$ echo "Dette vil blive gemt i history."
Dette vil blive gemt i history.
$ ls -l
-rw-rw-r--. 1 gdoc gdoc    0 Jan  7 11:51 file.txt
$ history
    1 HISTIGNORE="ls *:history"
    2 echo "Dette vil blive gemt i history."

HISTSIZE variablen

HISTSIZE beskriver hvor mange linjer som bliver gemt i Bash history. I Ubuntu 18.04 Lts er værdien 1000 linjer default.

$ echo $HISTSIZE
1000

Vi kan ændre dette med HISTSIZE efter ønske.

HISTSIZE=3
$ echo "første kommando"
første kommando
$ echo "anden kommando"
anden kommando
$ echo "tredje kommando"
tredje kommando
$ history
    2 echo "første kommando"
    3 echo "anden kommando"
    4 echo "tredje kommando"

Som du kan se er HISTSIZE=3 kommandoen slettet fra history, da det var den første kommando af de fire kommando er udførte. Måske lidt extremt, men håber det giver dig en ide om hvordan det virker.

HISTTIMEFORMAT variablen


HISTTIMEFORMATvariablen kan bruges til at lave et tids stemple hvornår kommandoen er udført. Dette timestamp format er bestemt at HISTTIMEFORMAT variablen. Nogle at værdierne som du kan bruge er disse:

Format Betydning
%d Dag
%m Måned
%Y År
%H Time
%M Minuter
%S Sekunder

Som altid et eksempel. Lad os sige du vil have formatet til at være DD/MM/YYYY format. Her er hvad du skal skrive.

$ HISTTIMEFORMAT="%d/%m/%Y %H:%M:%S "
$ echo "Denne kommando vil blive gemt i history med tidsstempel."
Denne kommando vil blive gemt i history med tidsstempel.
$ history
    1  21/01/2022 17:12:09 HISTTIMEFORMAT="%d/%m/%Y %H:%M:%S "
    2  21/01/2022 17:12:12 echo "Denne kommando vil blive gemt i history med tidsstempel.

Konklusion.

I denne tutorial skal vi se på hvordan kommandoer vi skriver, når vi bruger Bash, huskes i shell-historikken. Vi så, at historien til at begynde med opbevares i hukommelsen og derefter gemmes i den såkaldte “historie fil”, når shell-sessionen er lukket. Vi så, hvordan man visualiserer den nuværende shell-historie, hvordan man renser den, og hvordan man tvinger den til at blive skrevet til fil med det samme med kommandoen “historie”. Vi så også, hvordan man ændrer historie adfærd via nogle bash systemvariabler.

Author: Jeg er en professionel system administrator og grundlægger af linuxboxen.dk Jeg er en ivrig Linux-elsker og open source-entusiast. Jeg bruger Ubuntu og tror på at dele viden. Bortset fra Linux, elsker musik og dyr. Jeg er en stor fan af Dire straits.

Skriv et svar