Slik bruker du historiekommandoen på Linux

Linux-skallet lagrer en historikk over kommandoene du kjører, og du kan søke i den for å gjenta kommandoer du har kjørt tidligere. Når du forstår kommandoen Linux historie og hvordan du bruker den, kan den øke produktiviteten din betydelig.

Manipulere historie

Som George Santayana sa berømt, «De som ikke kan huske fortiden er dømt til å gjenta den.» Dessverre, på Linux, hvis du ikke kan huske fortiden, kan du ikke gjenta den, selv om du vil.

Det er da Linux historie-kommandoen kommer godt med. Den lar deg se gjennom og gjenta dine tidligere kommandoer. Dette er ikke ment å bare oppmuntre til latskap eller spare tid – det er også en effektivitetsfaktor (og nøyaktighet) som spiller inn. Jo lengre og mer komplisert en kommando er, desto vanskeligere er det å huske og skrive uten å gjøre en feil. Det er to typer feil: en som hindrer kommandoen i å fungere, og en som lar kommandoen fungere, men får den til å gjøre noe uventet.

Historiekommandoen eliminerer disse problemene. Som de fleste Linux-kommandoer, det er mer i det enn du kanskje tror. Men hvis du lærer hvordan du bruker historiekommandoen, kan den forbedre bruken av Linux-kommandolinjen, hver eneste dag. Det er en god investering av tiden din. Det er langt bedre måter å bruke historiekommandoen på enn å bare trykke på pil opp gjentatte ganger.

Historiekommandoen

I sin enkleste form kan du bruke historiekommandoen ved å bare skrive navnet:

history

De

Listen over tidligere brukte kommandoer skrives deretter til terminalvinduet.

Et eksempel på utgang fra

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

For å se et visst antall kommandoer kan du sende et nummer til historikken på kommandolinjen. For å se de siste 10 kommandoene du har brukt, skriver du for eksempel følgende:

history 10

De

Du kan oppnå samme resultat hvis du fører historikken gjennom halekommando. For å gjøre det, skriv inn følgende:

history | tail -n 10

De

Gjenta kommandoer

Hvis du vil gjenbruke en kommando fra historielisten, skriv inn et utropstegn (!) og nummeret på kommandoen uten mellomrom.

For å gjenta kommando nummer 37, skriver du for eksempel denne kommandoen:

!37

An

For å gjenta den siste kommandoen, skriv inn to utropstegn, igjen, uten mellomrom:

!!

An

Dette kan være nyttig når du utsteder en kommando og glemmer å bruke sudo. Skriv sudo, ett mellomrom, de doble utropstegnene, og trykk deretter Enter.

For følgende eksempel skrev vi en kommando som krever sudo. I stedet for å skrive inn hele linjen på nytt, kan vi lagre en haug med tastetrykk og bare skrive sudo !!, som vist nedenfor:

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

An

Så du kan skrive inn det tilsvarende tallet fra listen for å gjenta en kommando eller bruke de doble utropstegnene for å gjenta den siste kommandoen du brukte. Men hva om du vil gjenta den femte eller åttende kommandoen?

  Hvordan få mest mulig ut av en 3D-skriver på Linux med SuperSlicer

Du kan bruke ett utropstegn, en bindestrek (-) og nummeret på en tidligere kommando (igjen uten mellomrom) for å gjenta den.

For å gjenta den 13. forrige kommandoen, skriver du følgende:

!-13

An

Søker etter kommandoer etter streng

For å gjenta den siste kommandoen som starter med en bestemt streng, kan du skrive et utropstegn, og deretter strengen uten mellomrom, og deretter trykke Enter.

For å gjenta den siste kommandoen som startet med sudo, skriver du for eksempel denne kommandoen:

!sudo

An

Det er imidlertid et element av fare i dette. Hvis den siste kommandoen som startet med sudo ikke er den du tror den er, starter du feil kommando.

For å gi et sikkerhetsnett kan du imidlertid bruke modifikatoren :p (utskrift), som vist nedenfor:

!sudo:p

An

Dette instruerer historien til å skrive ut kommandoen til terminalvinduet, i stedet for å utføre den. Dette lar deg se kommandoen før du bruker den. Hvis det er kommandoen du ønsker, trykker du på pil opp og trykker Enter for å bruke den.

Hvis du vil finne en kommando som inneholder en bestemt streng, kan du bruke et utropstegn og spørsmålstegn.

For å finne og utføre den første samsvarende kommandoen som inneholder ordet «aliaser», skriver du for eksempel denne kommandoen:

!?aliases

An

Dette vil finne enhver kommando som inneholder strengen «aliaser», uavhengig av hvor den vises i strengen.

Interaktivt søk

Et interaktivt søk lar deg hoppe gjennom en liste over samsvarende kommandoer og gjenta den du ønsker.

Bare trykk Ctrl+r for å starte søket.

Et terminalvindu etter

Mens du skriver inn søketråden, vises den første samsvarende kommandoen. Bokstavene du skriver vises mellom tilbaketikken (`) og apostrof («). De samsvarende kommandoene oppdateres etter hvert som du skriver inn hver bokstav.

EN

Hver gang du trykker Ctrl+r, søker du bakover etter neste samsvarende kommando, som vises i terminalvinduet.

EN

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

De

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

EN

Kommandoen vises på kommandolinjen, og du kan redigere den.

Du kan bruke andre Linux-verktøy for å søke i historikklisten. For eksempel å overføre utdata fra historikk til grep og søk etter kommandoer som inneholder strengen «aliaser» kan du bruke denne kommandoen:

history | grep aliases

De

Endre den siste kommandoen

Hvis du trenger å fikse en skrivefeil, og deretter gjenta kommandoen, kan du bruke merket (^) for å endre den. Dette er et flott triks å ha i ermet når du staver feil eller ønsker å kjøre en på nytt med et annet kommandolinjealternativ eller parameter.

For å bruke den, skriv (uten mellomrom) en indikator, teksten du vil erstatte, en annen indikator, teksten du vil erstatte den med, en annen indikator, og trykk deretter Enter.

Anta for eksempel at du skriver inn følgende kommando, ved et uhell skriver «shhd» i stedet for «sshd»:

sudo systemctl start shhd

Du kan enkelt rette dette ved å skrive inn følgende:

^shhd^sshd^

EN

Kommandoen utføres med «shhd» korrigert til «sshd.»

  Slik installerer du OnlyOffice 6.3 på din Linux-PC

Slette kommandoer fra historikklisten

Du kan også slette kommandoer fra historikklisten med alternativet -d (slett). Det er ingen grunn til å beholde den feilstavede kommandoen din i historikklisten.

Du kan bruke grep for å finne det, sende nummeret til historien med -d-alternativet for å slette det, og deretter søke på nytt for å sikre at det er borte:

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

De

Du kan også sende en rekke kommandoer til alternativet -d. For å slette alle listeoppføringer fra 22 til 32 (inklusive), skriv inn denne kommandoen:

history -d 22 32

For å slette bare de siste fem kommandoene, kan du skrive inn et negativt tall, slik:

history -d -5

Manuell oppdatering av historikkfilen

Når du logger på eller åpner en terminaløkt, leses historikklisten inn fra historikkfilen. I Bash er standard historikkfil .bash_history.

Eventuelle endringer du gjør i den nåværende terminalvindusøkten blir bare skrevet til historiefilen når du lukker terminalvinduet eller logger ut.

Anta at du vil åpne et annet terminalvindu for å få tilgang til hele historikklisten, inkludert kommandoer du skrev inn i det første terminalvinduet. Alternativet -a (alle) lar deg gjøre dette i det første terminalvinduet før du åpner det andre.

For å bruke den, skriv inn følgende:

history -a

De

Kommandoene skrives stille til historiefilen.

Hvis du vil skrive alle endringer i historikklisten til historikkfilen (hvis du for eksempel slettet noen gamle kommandoer), kan du bruke -w (skrive)-alternativet, slik:

history -w

De

Sletter historikklisten

For å fjerne alle kommandoer fra historikklisten, kan du bruke alternativet -c (tøm), som følger:

history -c

Hvis du i tillegg vil tvinge disse endringene til historiefilen, bruk -w-alternativet, slik:

history -w

Sikkerhet og historikkfilen

Hvis du bruker applikasjoner som krever at du skriver inn sensitiv informasjon (som passord) på kommandolinjen, husk at dette også blir lagret i historikkfilen. Hvis du ikke vil at visse opplysninger skal lagres, kan du bruke følgende kommandostruktur for å slette den fra historikklisten umiddelbart:

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

EN

Denne strukturen inkluderer to kommandoer atskilt med semikolon (;). La oss bryte ned dette:

special-app: Navnet på programmet vi bruker.
my-secret-password: Det hemmelige passordet vi må oppgi for applikasjonen på kommandolinjen. Dette er slutten på kommando én.
historie -d: I kommando to påkaller vi -d (slett) alternativet for historie. Det vi skal slette kommer i neste del av kommandoen.
$(historie 1): Dette bruker en kommandoerstatning. Den delen av kommandoen som finnes i $() utføres i et subshell. Resultatet av den utførelsen legges ut som tekst i den opprinnelige kommandoen. History 1-kommandoen returnerer den forrige kommandoen. Så du kan tenke på den andre kommandoen som historie -d «siste kommando her.»

Du kan bruke history 5-kommandoen for å sikre at kommandoen som inneholder passordet ble fjernet fra historielisten.

Det er en enda enklere måte å gjøre dette på. Fordi Bash ignorerer linjer som begynner med et mellomrom som standard, inkluderer du bare et mellomrom på begynnelsen av linjen, som følger:

 special-app another-password
history 5

EN

Kommandoen med passordet legges ikke til i historikklisten. Grunnen til at dette trikset fungerer er inneholdt i .bashrc-filen.

  Hvordan bruke Keybase til å kryptere filer på Linux

.bashrc-filen

.bashrc-filen kjøres hver gang du logger på eller åpner et terminalvindu. Den inneholder også noen verdier som kontrollerer oppførselen til historiekommandoen. La oss redigere denne filen med gedit.

Skriv inn følgende:

gedit .bashrc

De

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

HISTSTØRRELSE: Maksimalt antall oppføringer historielisten kan inneholde.
HISTFILESIZE: Grensen for antall linjer en historiefil kan inneholde.

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

Når du logger på eller starter en terminalvindusøkt, fylles historikklisten ut fra .bash_history-filen.
Når du lukker et terminalvindu, lagres det maksimale antallet kommandoer satt i HISTSIZE i .bash_history-filen.
Hvis histappend shell-alternativet er aktivert, legges kommandoene til .bash_history. Hvis histappend ikke er satt, overskrives .bash_history.
Etter å ha lagret kommandoene fra historikklisten til .bash_history , avkortes historikkfilen slik at den ikke inneholder mer enn HISTFILESIZE-linjer.

Også nær toppen av filen ser du en oppføring for HISTCONTROL-verdien.

De

Du kan angi denne verdien til å gjøre ett av følgende:

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

Du kan også liste opp spesifikke kommandoer du ikke vil legge til i historikklisten. Skillet disse med et kolon (:) og satte dem i anførselstegn («…»).

Du vil følge denne strukturen for å legge til en linje i .bashrc-filen din, og erstatte kommandoene du vil ignorere:

export HISTIGNORE="ls:history"

An

Bruke tidsstempler

Hvis du vil legge til tidsstempler i historikklisten, kan du bruke HISTIMEFORMAT-innstillingen. For å gjøre det, legger du bare til en linje som følgende i .bashrc-filen din:

export HISTTIMEFORMAT="%c "

Merk at det er et mellomrom før de avsluttende anførselstegnene. Dette forhindrer tidsstemplet fra å slå opp til kommandoene i kommandolisten.

An

Nå, når du kjører historiekommandoen, ser du dato- og tidsstempler. Merk at alle kommandoer som var i historikklisten før du la til tidsstemplene vil bli tidsstemplet med dato og klokkeslett for den første kommandoen som mottar et tidsstempel. I dette eksemplet vist nedenfor var dette kommando 118.

Det er et veldig langdrygt tidsstempel. Du kan imidlertid bruke andre tokens enn %c for å avgrense den. De andre tokenene du kan bruke er:

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

La oss eksperimentere og bruke noen forskjellige tokens:

export HISTTIMEFORMAT="%d n%m %T "

Eksporten HISTTIMEFORMAT=

Utdataene bruker dag, måned og klokkeslett.

Hvis vi fjerner dagen og måneden, vil den bare vise klokkeslettet.

Eventuelle endringer du gjør i HISTIMEFORMAT gjelder for hele historikklisten. Dette er mulig fordi tiden for hver kommando er lagret som antall sekunder fra Unix-epoken. HISTTIMEFORMAT-direktivet spesifiserer ganske enkelt formatet som brukes til å gjengi det antallet sekunder til en menneskelig lesbar stil, for eksempel:

export HISTTIMEFORMAT="%T "

De

Vår produksjon er nå mer håndterlig.

Du kan også bruke historiekommandoen til å revidere. Noen ganger kan gjennomgang av kommandoer du har brukt tidligere hjelpe deg med å identifisere hva som kan ha forårsaket et problem.

Akkurat som du kan i livet, på Linux, kan du bruke historiekommandoen til å gjenoppleve de gode tidene og lære av de dårlige.