history — istorija komandi

Bash pamti sve što otkucaš. To nije samo udobnost — istorija ti štedi kucanje dugih komandi, pomaže da rekonstruišeš šta si radio pre tri dana, i jedan je od prvih izvora u koji se gleda kad nešto krene naopako.

Oblik komande

history [broj]
history [opcije]
  • broj — prikaži samo poslednjih toliko komandi
  • opcije — brisanje, upis i učitavanje istorije

Pregled

$ history
  138  cd /var/log
  139  ls -lt
  140  tail -n 50 messages
  141  systemctl status httpd
  142  history

Svaka komanda ima svoj broj — on je bitan, jer se preko njega komanda poziva ponovo.

Ako te zanima samo skorašnje:

$ history 10

A kad tražiš nešto konkretno, provuci kroz grep:

$ history | grep systemctl
$ history | grep -i docker

Ovo je jedan od najkorisnijih obrazaca u svakodnevnom radu — setiš se da si nešto radio, ali ne i kako tačno.

Ponavljanje komandi

Strelice

Taster vraća prethodnu komandu, ide napred. Najjednostavniji način i onaj koji ćeš koristiti najviše.

Ctrl+R — pretraga

Ovo je prečica koja stvarno menja tempo rada. Pritisni Ctrl+R i počni da kucaš — bash traži poslednju komandu koja sadrži taj tekst:

(reverse-i-search)`httpd': systemctl restart httpd
TasterRadnja
Ctrl+R ponovotraži dalje unazad
Enterizvrši pronađenu komandu
ili Ctrl+Eubaci je u red za doradu
Ctrl+Godustani

Ako komandu treba malo izmeniti — recimo drugo ime servisa — koristi strelicu umesto Entera.

Oznake sa uzvičnikom

$ !!            ponovi poslednju komandu
$ !142          ponovi komandu broj 142
$ !-3           ponovi treću odozgo
$ !systemctl    poslednju koja počinje sa "systemctl"
$ !?httpd       poslednju koja sadrži "httpd"

Najkorisnija je !!, i to u ovoj situaciji:

$ systemctl restart httpd
Failed to restart httpd.service: Access denied

$ sudo !!

Zaboravio si sudo — ne kucaš ponovo, nego dodaš ispred.

Delovi prethodne komande

$ !$        poslednji argument prethodne komande
$ !^        prvi argument
$ !*        svi argumenti

Ovo se najviše isplati kad radiš sa dugim putanjama:

$ ls -l /etc/httpd/conf/httpd.conf
$ vi !$

Druga komanda otvara isti fajl, bez ponovnog kucanja putanje. Istu stvar radi i prečica Alt+., koja ubacuje poslednji argument prethodne komande — a mnogima je udobnija jer odmah vidiš šta si dobio.

Provera pre izvršavanja

Ako nisi siguran šta će !142 pokrenuti, dodaj :p:

$ !142:p
rm -rf /home/alen/staro

Komanda se ispisuje ali se ne izvršava, i ulazi na kraj istorije pa je posle možeš pozvati sa !!. Dobra navika kad u istoriji ima komandi koje brišu.

Gde se istorija čuva

$ echo $HISTFILE
/home/alen/.bash_history

Fajl je običan tekst i možeš ga čitati:

$ tail -20 ~/.bash_history

Bitan detalj: komande se upisuju u fajl tek pri odjavi, ne odmah. Zato u fajlu neće biti onoga što si kucao u tekućoj sesiji, a ono što kucaš u drugom terminalu nećeš videti u ovom.

Ako ti treba odmah:

$ history -a        upiši tekuću sesiju u fajl
$ history -r        učitaj fajl u tekuću sesiju
$ history -c        očisti istoriju tekuće sesije

Podešavanje

Ponašanje istorije određuje nekoliko promenljivih. Postavljaju se u ~/.bashrc:

HISTSIZE=10000
HISTFILESIZE=20000
HISTCONTROL=ignoreboth
HISTIGNORE="ls:ll:cd:pwd:clear:history"
HISTTIMEFORMAT="%F %T  "
PromenljivaŠta radi
HISTSIZEkoliko komandi se pamti u sesiji
HISTFILESIZEkoliko ih ostaje u fajlu
HISTCONTROLignoredups preskače ponovljene, ignorespace preskače one koje počinju razmakom, ignoreboth oba
HISTIGNOREobrasci koji se uopšte ne pamte
HISTTIMEFORMATdodaje vreme uz svaku komandu

Vremenska oznaka je najkorisnija od svih:

$ history 5
  138  2026-08-21 14:02:11  cd /var/log
  139  2026-08-21 14:02:15  ls -lt
  140  2026-08-21 14:03:40  tail -n 50 messages

Bez nje istorija ti kaže šta je urađeno, ali ne i kada — a to je često upravo ono što tražiš.

Kako da komanda ne uđe u istoriju

Ako je postavljeno HISTCONTROL=ignorespace, dovoljan je razmak ispred:

$  mysql -u root -ptajnalozinka

Komanda se izvršava, ali se ne pamti. Korisno, mada nije pravo rešenje — lozinku i dalje vide drugi korisnici u spisku procesa. Ispravno je koristiti konfiguracioni fajl ili promenljive okruženja.

Brisanje istorije

$ history -d 142           obriši jednu komandu
$ history -c               očisti sesiju
$ history -c && history -w  očisti i sesiju i fajl

Ili grubo:

$ > ~/.bash_history

Vredi znati i drugu stranu ovoga. Na deljenom serveru prazna istorija je sama po sebi sumnjiva — a ozbiljni sistemi ionako beleže komande kroz auditd ili centralizovane logove, gde korisnik ne može da briše. Istorija je alat za tvoju udobnost, ne mehanizam bezbednosti.

Zašto istorija ponekad nestane

Više terminala otvoreno istovremeno

Podrazumevano, poslednji koji se zatvori prepiše fajl svojom istorijom. Ono što si radio u drugom prozoru — nestaje.

Rešenje je u ~/.bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a; history -n"

Prva linija govori bash-u da dodaje umesto da prepisuje, druga da posle svake komande odmah upiše u fajl i pročita šta su drugi upisali. Time sve sesije dele zajedničku istoriju.

Sesija je prekinuta grubo

Ako zatvoriš prozor umesto da otkucaš exit, ili ti pukne veza, istorija se ne upisuje. Gornje podešavanje rešava i to.

Skripte nemaju istoriju

Neinteraktivne sesije je ne vode. To je očekivano — istorija postoji za čoveka koji kuca.

Praktični primeri

Šta si radio danas:

$ history | grep "$(date +%F)"

Deset komandi koje najčešće koristiš:

$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head

Sve komande sa docker, pretvorene u skriptu:

$ history | grep docker | cut -d' ' -f4- > docker-komande.sh

Ovo poslednje je zgodan način da posao koji si odradio ručno pretvoriš u skriptu — istorija je već zapisala sve korake.

Vežba

  1. Pogledaj poslednjih deset komandi
  2. Pronađi u istoriji sve u kojima se pojavljuje ls
  3. Pokreni neku komandu, pa je ponovi sa !!
  4. Otkucaj ls /etc/hosts, pa zatim cat !$
  5. Uključi HISTTIMEFORMAT u ~/.bashrc, otvori novi terminal i pogledaj razliku
  6. Probaj Ctrl+R i pronađi komandu koju si kucao ranije
  7. Vidi šta radi !142:p na nekom broju iz svoje istorije

Sledeći korak → alias

Povezano: Rad iz komandne linije · grep · echo · Linux osnove

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd