Hur man använder historikkommandot på Linux

Linuxs skal sparar en historik över de kommandon du kör, och du kan söka i den för att upprepa kommandon du har kört tidigare. När du väl förstår kommandot Linux historia och hur du använder det kan det öka din produktivitet avsevärt.

Manipulera historia

Som George Santayana sa berömt, ”De som inte kan minnas det förflutna är dömda att upprepa det.” Tyvärr, på Linux, om du inte kommer ihåg det förflutna, kan du inte upprepa det, även om du vill.

Det är då kommandot Linux historia kommer till användning. Det låter dig granska och upprepa dina tidigare kommandon. Detta är inte avsett att bara uppmuntra till lättja eller spara tid – det finns också en effektivitetsfaktor (och noggrannhet) som spelar in. Ju längre och mer komplicerat ett kommando är, desto svårare är det att komma ihåg och skriva utan att göra ett fel. Det finns två typer av fel: ett som hindrar kommandot från att fungera och ett som låter kommandot fungera, men får det att göra något oväntat.

Historiekommandot eliminerar dessa problem. Som de flesta Linux-kommandon, det finns mer i det än du kanske tror. Men om du lär dig hur du använder historikkommandot kan det förbättra din användning av Linux-kommandoraden, varje dag. Det är en bra investering av din tid. Det finns mycket bättre sätt att använda historikkommandot än att bara trycka på uppåtpilen upprepade gånger.

Historiekommandot

I sin enklaste form kan du använda historikkommandot genom att bara skriva in dess namn:

history

De

Listan över tidigare använda kommandon skrivs sedan till terminalfönstret.

Ett exempel på utdata från

Kommandona är numrerade, med de senast använda (de med de högsta siffrorna) i slutet av listan.

För att se ett visst antal kommandon kan du skicka ett nummer till historiken på kommandoraden. Till exempel, för att se de senaste 10 kommandona du har använt, skriv följande:

history 10

De

Du kan uppnå samma resultat om du rör historien genom svanskommando. För att göra det, skriv följande:

history | tail -n 10

De

Upprepande kommandon

Om du vill återanvända ett kommando från historiklistan, skriv ett utropstecken (!) och numret på kommandot utan mellanslag däremellan.

Till exempel, för att upprepa kommando nummer 37, skulle du skriva detta kommando:

!37

En

För att upprepa det sista kommandot, skriv två utropstecken, igen, utan mellanslag:

!!

En

Detta kan vara användbart när du utfärdar ett kommando och glömmer att använda sudo. Skriv sudo, ett mellanslag, de dubbla utropstecken och tryck sedan på Enter.

För följande exempel skrev vi ett kommando som kräver sudo. Istället för att skriva om hela raden kan vi spara ett gäng tangenttryckningar och bara skriva sudo !!, som visas nedan:

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

En

Så du kan skriva motsvarande nummer från listan för att upprepa ett kommando eller använda dubbla utropstecken för att upprepa det senaste kommandot du använde. Men vad händer om du vill upprepa det femte eller åttonde kommandot?

Du kan använda ett utropstecken, ett bindestreck (-) och numret på ett tidigare kommando (igen, utan mellanslag) för att upprepa det.

För att upprepa det 13:e föregående kommandot, skulle du skriva följande:

!-13

En

Söker efter kommandon efter sträng

För att upprepa det sista kommandot som börjar med en viss sträng kan du skriva ett utropstecken och sedan strängen utan mellanslag och sedan trycka på Enter.

Till exempel, för att upprepa det senaste kommandot som började med sudo, skulle du skriva det här kommandot:

!sudo

En

Det finns dock ett inslag av fara i detta. Om det sista kommandot som började med sudo inte är det du tror att det är, kommer du att starta fel kommando.

För att tillhandahålla ett skyddsnät kan du dock använda modifieraren :p (utskrift), som visas nedan:

!sudo:p

En

Detta instruerar historien att skriva ut kommandot till terminalfönstret, snarare än att köra det. Detta gör att du kan se kommandot innan du använder det. Om det är kommandot du vill ha, tryck på uppåtpilen och tryck sedan på Enter för att använda det.

Om du vill hitta ett kommando som innehåller en viss sträng kan du använda ett utropstecken och frågetecken.

Till exempel, för att hitta och utföra det första matchande kommandot som innehåller ordet ”alias”, skulle du skriva det här kommandot:

!?aliases

En

Detta kommer att hitta alla kommandon som innehåller strängen ”alias”, oavsett var den förekommer i strängen.

Interaktiv sökning

En interaktiv sökning låter dig hoppa igenom en lista med matchande kommandon och upprepa det du vill ha.

Tryck bara på Ctrl+r för att starta sökningen.

Ett terminalfönster efter

När du skriver sök ledtråden visas det första matchande kommandot. Bokstäverna du skriver visas mellan backteck (`) och apostrof (’). De matchande kommandona uppdateras när du skriver varje bokstav.

A

Varje gång du trycker på Ctrl+r söker du bakåt efter nästa matchande kommando, som visas i terminalfönstret.

A

När du trycker på Enter kommer det visade kommandot att köras.

De

För att redigera ett kommando innan du utför det, tryck antingen på vänster- eller högerpilen.

A

Kommandot visas på kommandoraden och du kan redigera det.

Du kan använda andra Linux-verktyg för att söka i historiklistan. Till exempel för att överföra utdata från historiken till grep och sök efter kommandon som innehåller strängen ”alias” kan du använda detta kommando:

history | grep aliases

De

Ändra det sista kommandot

Om du behöver åtgärda ett stavfel och sedan upprepa kommandot, kan du använda raden (^) för att ändra det. Det här är ett bra knep att ha i rockärmen när du stavar fel på ett kommando eller vill köra ett nytt med ett annat kommandoradsalternativ eller parameter.

För att använda den, skriv (utan mellanslag) en indikator, texten du vill ersätta, en annan indikator, texten du vill ersätta den med, en annan indikator och tryck sedan på Retur.

Anta till exempel att du skriver följande kommando, av misstag skriver ”shhd” istället för ”sshd”:

sudo systemctl start shhd

Du kan enkelt rätta till detta genom att skriva följande:

^shhd^sshd^

A

Kommandot körs med ”shhd” korrigerad till ”sshd.”

Ta bort kommandon från historiklistan

Du kan också ta bort kommandon från historiklistan med alternativet -d (radera). Det finns ingen anledning att behålla ditt felstavade kommando i historiklistan.

Du kan använda grep för att hitta det, skicka dess nummer till historiken med alternativet -d för att radera det och sedan söka igen för att se till att det är borta:

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

De

Du kan också skicka ett antal kommandon till alternativet -d. För att radera alla listposter från 22 till 32 (inklusive), skriv detta kommando:

history -d 22 32

Om du bara vill ta bort de fem sista kommandona kan du skriva ett negativt tal, så här:

history -d -5

Manuell uppdatering av historikfilen

När du loggar in eller öppnar en terminalsession läses historiklistan in från historikfilen. I Bash är standardhistorikfilen .bash_history.

Eventuella ändringar du gör i din nuvarande terminalfönstersession skrivs bara till historikfilen när du stänger terminalfönstret eller loggar ut.

Anta att du vill öppna ett annat terminalfönster för att komma åt hela historiklistan, inklusive kommandon du skrev i det första terminalfönstret. Alternativet -a (alla) låter dig göra detta i det första terminalfönstret innan du öppnar det andra.

För att använda det, skriv följande:

history -a

De

Kommandona skrivs tyst till historikfilen.

Om du vill skriva alla ändringar i historiklistan till historikfilen (om du till exempel raderade några gamla kommandon), kan du använda alternativet -w (skriva), som så:

history -w

De

Rensa historiklistan

För att rensa alla kommandon från historiklistan kan du använda alternativet -c (rensa) enligt följande:

history -c

Om du dessutom vill tvinga fram dessa ändringar i historikfilen, använd alternativet -w, som så:

history -w

Säkerhet och historikfilen

Om du använder några program som kräver att du skriver känslig information (som lösenord) på kommandoraden, kom ihåg att detta också kommer att sparas i historikfilen. Om du inte vill att viss information ska sparas kan du använda följande kommandostruktur för att ta bort den från historiklistan omedelbart:

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

A

Denna struktur innehåller två kommandon separerade med semikolon (;). Låt oss bryta ner det här:

special-app: Namnet på programmet vi använder.
my-secret-password: Det hemliga lösenordet vi behöver tillhandahålla för applikationen på kommandoraden. Detta är slutet på kommando ett.
history -d: I kommando två anropar vi alternativet -d (radera) för historia. Det vi ska ta bort kommer i nästa del av kommandot.
$(historia 1): Detta använder en kommandosubstitution. Den del av kommandot som finns i $() exekveras i ett underskal. Resultatet av den körningen publiceras som text i det ursprungliga kommandot. Kommandot historik 1 returnerar föregående kommando. Så du kan tänka på det andra kommandot som historia -d ”sista kommandot här.”

Du kan använda kommandot history 5 för att se till att kommandot som innehåller lösenordet togs bort från historiklistan.

Det finns dock ett ännu enklare sätt att göra detta. Eftersom Bash ignorerar rader som börjar med ett mellanslag som standard, inkludera bara ett mellanslag i början av raden, enligt följande:

 special-app another-password
history 5

A

Kommandot med lösenordet läggs inte till i historiklistan. Anledningen till att detta trick fungerar finns i .bashrc-filen.

.bashrc-filen

.bashrc-filen körs varje gång du loggar in eller öppnar ett terminalfönster. Den innehåller också några värden som styr historikkommandots beteende. Låt oss redigera den här filen med gedit.

Skriv följande:

gedit .bashrc

De

Nära toppen av filen ser du två poster:

HISTSTORLEK: Det maximala antalet poster som historiklistan kan innehålla.
HISTFILESIZE: Gränsen för antalet rader en historikfil kan innehålla.

Dessa två värden samverkar på följande sätt:

När du loggar in eller startar en terminalfönstersession fylls historiklistan i från .bash_history-filen.
När du stänger ett terminalfönster sparas det maximala antalet kommandon som anges i HISTSIZE i filen .bash_history.
Om histappend-skalalternativet är aktiverat, läggs kommandona till i .bash_history. Om histappend inte är inställd skrivs .bash_history över.
Efter att ha sparat kommandona från historiklistan till .bash_history, trunkeras historikfilen så att den inte innehåller fler än HISTFILESIZE-rader.

Också nära toppen av filen ser du en post för HISTCONTROL-värdet.

De

Du kan ställa in detta värde för att göra något av följande:

ignorespaces:Rader som börjar med ett blanksteg läggs inte till i historiklistan.
ignoredups: Duplicerade kommandon läggs inte till i historikfilen.
ignoreboth: Aktiverar båda ovanstående.

Du kan också lista specifika kommandon som du inte vill lägga till i din historiklista. Separerade dessa med ett kolon (:) och satte dem inom citattecken (”…”).

Du skulle följa den här strukturen för att lägga till en rad i din .bashrc-fil och ersätta de kommandon du vill ska ignoreras:

export HISTIGNORE="ls:history"

En

Använda tidsstämplar

Om du vill lägga till tidsstämplar till historiklistan kan du använda inställningen HISTIMEFORMAT. För att göra det lägger du bara till en rad som följande i din .bashrc-fil:

export HISTTIMEFORMAT="%c "

Observera att det finns ett mellanslag före de avslutande citattecken. Detta förhindrar att tidsstämpeln stämmer överens med kommandona i kommandolistan.

En

Nu när du kör historikkommandot ser du datum- och tidsstämplar. Observera att alla kommandon som fanns i historiklistan innan du lade till tidsstämplarna kommer att tidsstämplas med datum och tid för det första kommandot som tar emot en tidsstämpel. I det här exemplet nedan var det kommando 118.

Det är en väldigt långrandig tidsstämpel. Du kan dock använda andra tokens än %c för att förfina den. De andra tokens du kan använda är:

%D-dagen
%m: Månad
%y: år
%H: timme
%M: Minuter
%S: sekunder
%F: Fullständigt datum (format år-månad-datum)
%T: Tid (format timme:minuter:sekunder)
%c: Komplett datum- och tidsstämpel (formaten dag-datum-månad-år och timme:minuter:sekunder)

Låt oss experimentera och använda några olika tokens:

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

Exporten HISTTIMEFORMAT=

Utdatan använder dag, månad och tid.

Om vi ​​tar bort dagen och månaden kommer det bara att visa tiden.

Alla ändringar du gör i HISTIMEFORMAT tillämpas på hela historiklistan. Detta är möjligt eftersom tiden för varje kommando lagras som antal sekunder från Unix-epoken. HISTTIMEFORMAT-direktivet anger helt enkelt formatet som används för att återge det antalet sekunder till en läsbar stil, till exempel:

export HISTTIMEFORMAT="%T "

De

Vår produktion är nu mer hanterbar.

Du kan också använda historikkommandot för att granska. Ibland kan genom att granska kommandon som du har använt tidigare hjälpa dig att identifiera vad som kan ha orsakat ett problem.

Precis som du kan i livet, på Linux, kan du använda historikkommandot för att återuppleva de goda tiderna och lära av de dåliga.