Sådan bruger du historiekommandoen på Linux

Linux’s shell gemmer en historik over de kommandoer, du kører, og du kan søge i den for at gentage kommandoer, du har kørt tidligere. Når du først forstår kommandoen Linux historie, og hvordan du bruger den, kan den øge din produktivitet markant.

Manipulere historie

Som George Santayana sagde berømt, “De, der ikke kan huske fortiden, er dømt til at gentage den.” Desværre, på Linux, hvis du ikke kan huske fortiden, kan du ikke gentage det, selvom du vil.

Det er, når kommandoen Linux historie kommer til nytte. Det giver dig mulighed for at gennemgå og gentage dine tidligere kommandoer. Dette er ikke beregnet til blot at opmuntre til dovenskab eller spare tid – der er også en effektivitets- (og nøjagtighedsfaktor) på spil. Jo længere og mere kompliceret en kommando er, jo sværere er den at huske og skrive uden at lave en fejl. Der er to typer fejl: en der forhindrer kommandoen i at virke, og en der tillader kommandoen at virke, men får den til at gøre noget uventet.

Historiekommandoen eliminerer disse problemer. Ligesom de fleste Linux-kommandoer, der er mere i det, end du måske tror. Men hvis du lærer at bruge kommandoen historie, kan det forbedre din brug af Linux-kommandolinjen hver eneste dag. Det er en god investering af din tid. Der er langt bedre måder at bruge historiekommandoen på end blot at trykke på pil op gentagne gange.

Historiekommandoen

I sin enkleste form kan du bruge historiekommandoen ved blot at skrive dens navn:

history

Det

Listen over tidligere brugte kommandoer skrives derefter til terminalvinduet.

Et eksempel på output fra

Kommandoerne er nummererede, med de senest brugte (dem med de højeste tal) i slutningen af ​​listen.

For at se et bestemt antal kommandoer kan du sende et nummer til historikken på kommandolinjen. For at se de sidste 10 kommandoer, du har brugt, skal du for eksempel skrive følgende:

history 10

Det

Du kan opnå det samme resultat, hvis du fører historikken igennem hale kommando. For at gøre det skal du skrive følgende:

history | tail -n 10

Det

Gentagende kommandoer

Hvis du vil genbruge en kommando fra historiklisten, skal du indtaste et udråbstegn (!) og nummeret på kommandoen uden mellemrum.

For at gentage kommando nummer 37 for eksempel, skal du skrive denne kommando:

!37

An

For at gentage den sidste kommando, skriv to udråbstegn igen uden mellemrum:

!!

An

Dette kan være nyttigt, når du udsteder en kommando og glemmer at bruge sudo. Skriv sudo, et mellemrum, de dobbelte udråbstegn, og tryk derefter på Enter.

I det følgende eksempel skrev vi en kommando, der kræver sudo. I stedet for at skrive hele linjen igen, kan vi gemme en masse tastetryk og bare skrive sudo !!, som vist nedenfor:

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

An

Så du kan skrive det tilsvarende tal fra listen for at gentage en kommando eller bruge de dobbelte udråbstegn for at gentage den sidste kommando, du brugte. Men hvad nu hvis du vil gentage den femte eller ottende kommando?

  Sådan installeres Sigil eBook Editor på Linux

Du kan bruge et udråbstegn, en bindestreg (-) og nummeret på en tidligere kommando (igen uden mellemrum) til at gentage det.

For at gentage den 13. forrige kommando, skal du skrive følgende:

!-13

An

Søger efter kommandoer efter streng

For at gentage den sidste kommando, der starter med en bestemt streng, kan du skrive et udråbstegn og derefter strengen uden mellemrum og derefter trykke på Enter.

For at gentage den sidste kommando, der startede med sudo, skal du for eksempel skrive denne kommando:

!sudo

An

Der er dog et element af fare i dette. Hvis den sidste kommando, der startede med sudo, ikke er den, du tror, ​​den er, vil du starte den forkerte kommando.

For at give et sikkerhedsnet kan du dog bruge :p (print) modifier, som vist nedenfor:

!sudo:p

An

Dette instruerer historien om at udskrive kommandoen til terminalvinduet i stedet for at udføre den. Dette giver dig mulighed for at se kommandoen, før du bruger den. Hvis det er den kommando, du ønsker, skal du trykke på pil op og derefter trykke på Enter for at bruge den.

Hvis du vil finde en kommando, der indeholder en bestemt streng, kan du bruge et udråbstegn og spørgsmålstegn.

For at finde og udføre den første matchende kommando, der indeholder ordet “aliaser”, skriver du denne kommando:

!?aliases

An

Dette vil finde enhver kommando, der indeholder strengen “aliaser”, uanset hvor den vises i strengen.

Interaktiv søgning

En interaktiv søgning giver dig mulighed for at hoppe gennem en liste over matchende kommandoer og gentage den, du ønsker.

Tryk blot på Ctrl+r for at starte søgningen.

Et terminalvindue efter

Mens du skriver søgeordet, vises den første matchende kommando. De bogstaver, du indtaster, vises mellem backtick (`) og apostrof (‘). De matchende kommandoer opdateres, når du skriver hvert bogstav.

EN

Hver gang du trykker på Ctrl+r, søger du baglæns efter den næste matchende kommando, som vises i terminalvinduet.

EN

Når du trykker på Enter, udføres den viste kommando.

Det

For at redigere en kommando, før du udfører den, skal du trykke på enten venstre eller højre piletast.

EN

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

Du kan bruge andre Linux-værktøjer til at søge i historiklisten. For eksempel at overføre output fra historie til grep og søg efter kommandoer, der indeholder strengen “aliaser” kan du bruge denne kommando:

history | grep aliases

Det

Ændring af den sidste kommando

Hvis du har brug for at rette en tastefejl og derefter gentage kommandoen, kan du bruge indikatoren (^) til at ændre den. Dette er et godt trick at have i ærmet, når du staver en kommando forkert eller ønsker at køre en igen med en anden kommandolinjeindstilling eller parameter.

For at bruge den skal du skrive (uden mellemrum) en indtegning, den tekst, du vil erstatte, en anden indtegning, den tekst, du vil erstatte den med, en anden indtegning, og derefter trykke på Enter.

Antag for eksempel, at du skriver følgende kommando, ved et uheld skriver “shhd” i stedet for “sshd”:

sudo systemctl start shhd

Du kan nemt rette dette ved at skrive følgende:

^shhd^sshd^

EN

Kommandoen udføres med “shhd” korrigeret til “sshd.”

  Sådan kører du Windows-apps på Linux med vin

Sletning af kommandoer fra historiklisten

Du kan også slette kommandoer fra historiklisten med muligheden -d (slet). Der er ingen grund til at beholde din fejlstavede kommando i historiklisten.

Du kan bruge grep til at finde det, videregive dets nummer til historikken med muligheden -d for at slette det og derefter søge igen for at sikre, at det er væk:

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

Det

Du kan også sende en række kommandoer til indstillingen -d. For at slette alle listeposter fra 22 til 32 (inklusive), skriv denne kommando:

history -d 22 32

For kun at slette de sidste fem kommandoer, kan du skrive et negativt tal, som sådan:

history -d -5

Manuel opdatering af historikfilen

Når du logger på eller åbner en terminalsession, læses historiklisten ind fra historikfilen. I Bash er standardhistorikfilen .bash_history.

Eventuelle ændringer, du foretager i din aktuelle terminalvinduesession, skrives kun til historiefilen, når du lukker terminalvinduet eller logger ud.

Antag, at du vil åbne et andet terminalvindue for at få adgang til den fulde historieliste, inklusive kommandoer du indtastede i det første terminalvindue. Valgmuligheden -a (alle) giver dig mulighed for at gøre dette i det første terminalvindue, før du åbner det andet.

For at bruge det, skriv følgende:

history -a

Det

Kommandoerne skrives lydløst til historiefilen.

Hvis du vil skrive alle ændringer til historielisten til historiefilen (hvis du f.eks. har slettet nogle gamle kommandoer), kan du bruge -w (skrive) muligheden, som sådan:

history -w

Det

Rydning af historiklisten

For at rydde alle kommandoer fra historiklisten kan du bruge indstillingen -c (clear) som følger:

history -c

Hvis du yderligere vil tvinge disse ændringer til historiefilen, skal du bruge -w-indstillingen, som sådan:

history -w

Sikkerhed og historiefilen

Hvis du bruger programmer, der kræver, at du indtaster følsomme oplysninger (såsom adgangskoder) på kommandolinjen, skal du huske, at dette også bliver gemt i historiefilen. Hvis du ikke vil have visse oplysninger gemt, kan du bruge følgende kommandostruktur til at slette dem fra historiklisten med det samme:

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

EN

Denne struktur inkluderer to kommandoer adskilt med et semikolon (;). Lad os opdele dette:

special-app: Navnet på det program, vi bruger.
my-secret-password: Den hemmelige adgangskode, vi skal levere til applikationen på kommandolinjen. Dette er slutningen af ​​kommando 1.
historie -d: I kommando to påkalder vi -d (slet) mulighed for historie. Det, vi skal slette, kommer i den næste del af kommandoen.
$(historie 1): Dette bruger en kommandoerstatning. Den del af kommandoen, der er indeholdt i $() udføres i en subshell. Resultatet af den udførelse lægges som tekst i den originale kommando. Historie 1-kommandoen returnerer den forrige kommando. Så du kan tænke på den anden kommando som historie -d “sidste kommando her.”

Du kan bruge kommandoen history 5 til at sikre, at kommandoen, der indeholder adgangskoden, blev fjernet fra historiklisten.

Der er dog en endnu enklere måde at gøre dette på. Fordi Bash ignorerer linjer, der begynder med et mellemrum som standard, skal du blot inkludere et mellemrum i starten af ​​linjen, som følger:

 special-app another-password
history 5

EN

Kommandoen med adgangskoden føjes ikke til historiklisten. Grunden til at dette trick virker er indeholdt i .bashrc-filen.

  Sådan bruger du rclone til at sikkerhedskopiere til Google Drev på Linux

.bashrc-filen

.bashrc-filen udføres hver gang du logger på eller åbner et terminalvindue. Den indeholder også nogle værdier, der styrer historikkommandoens adfærd. Lad os redigere denne fil med gedit.

Indtast følgende:

gedit .bashrc

Det

Nær toppen af ​​filen ser du to poster:

HISTSTØRRELSE: Det maksimale antal poster historielisten kan indeholde.
HISTFILESIZE: Grænsen for antallet af linjer en historiefil kan indeholde.

Disse to værdier interagerer på følgende måder:

Når du logger på eller starter en terminalvinduesession, udfyldes historiklisten fra .bash_history-filen.
Når du lukker et terminalvindue, gemmes det maksimale antal kommandoer indstillet i HISTSIZE i .bash_history-filen.
Hvis histappend shell-indstillingen er aktiveret, føjes kommandoerne til .bash_history. Hvis histappend ikke er indstillet, overskrives .bash_history.
Efter at have gemt kommandoerne fra historiklisten til .bash_history, afkortes historikfilen, så den ikke indeholder mere end HISTFILESIZE-linjer.

Også nær toppen af ​​filen ser du en indgang for HISTCONTROL-værdien.

Det

Du kan indstille denne værdi til at gøre et af følgende:

ignorespaces: Linjer, der begynder med et mellemrum, føjes ikke til historiklisten.
ignoredups:Duplikerede kommandoer føjes ikke til historiefilen.
ignoreboth: Aktiverer begge ovenstående.

Du kan også angive specifikke kommandoer, som du ikke ønsker tilføjet til din historieliste. Adskilte disse med et kolon (:) og satte dem i anførselstegn (“…”).

Du ville følge denne struktur for at tilføje en linje til din .bashrc-fil og erstatte de kommandoer, du ønsker at blive ignoreret:

export HISTIGNORE="ls:history"

An

Brug af tidsstempler

Hvis du vil tilføje tidsstempler til historiklisten, kan du bruge indstillingen HISTIMEFORMAT. For at gøre det skal du blot tilføje en linje som følgende til din .bashrc-fil:

export HISTTIMEFORMAT="%c "

Bemærk, at der er et mellemrum før de afsluttende anførselstegn. Dette forhindrer tidsstemplet i at støde op til kommandoerne i kommandolisten.

An

Nu, når du kører historiekommandoen, ser du dato- og tidsstempler. Bemærk, at alle kommandoer, der var på historiklisten, før du tilføjede tidsstemplerne, vil blive tidsstemplet med datoen og klokkeslættet for den første kommando, der modtager et tidsstempel. I dette eksempel vist nedenfor var dette kommando 118.

Det er et meget langhåret tidsstempel. Du kan dog bruge andre tokens end %c til at forfine det. De andre tokens du kan bruge er:

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

Lad os eksperimentere og bruge et par forskellige tokens:

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

Eksporten HISTTIMEFORMAT=

Outputtet bruger dag, måned og klokkeslæt.

Hvis vi fjerner dagen og måneden, vil den dog kun vise klokkeslættet.

Alle ændringer, du foretager i HISTIMEFORMAT, gælder for hele historiklisten. Dette er muligt, fordi tiden for hver kommando er gemt som antal sekunder fra Unix-epoken. HISTTIMEFORMAT-direktivet angiver simpelthen det format, der bruges til at gengive det antal sekunder til en menneskelig læsbar stil, såsom:

export HISTTIMEFORMAT="%T "

Det

Vores output er nu mere overskueligt.

Du kan også bruge historikkommandoen til at revidere. Nogle gange kan gennemgang af kommandoer, du har brugt tidligere, hjælpe dig med at identificere, hvad der kan have forårsaget et problem.

Ligesom du kan i livet, på Linux, kan du bruge historiekommandoen til at genopleve de gode tider og lære af de dårlige.