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.
Software som skal bruges eller bliver brugt.
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
HISTTIMEFORMAT
variablen 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.