.bashrc u praksi — prompt, istorija i korisna podešavanja

Koji fajl se kad čita, objašnjeno je u lekciji Login skripte. Ova stranica je o drugom pitanju: šta u taj fajl konkretno staviti.

Podrazumevani ~/.bashrc je pristojan, ali skroman. Sat vremena uloženo u njega vraća se svakodnevno — kroz prompt koji ti kaže gde si, istoriju koja se ne gubi i nekoliko funkcija koje skraćuju ono što kucaš najviše.

Pre nego što počneš

$ cp ~/.bashrc ~/.bashrc.bak

I drži otvorenu drugu sesiju dok radiš. Greška u ovom fajlu ume da ti otežal prijavu, a iz otvorene sesije je popravljaš u pola minuta.

Sve svoje dodaj ispod bloka koji već stoji na vrhu:

case $- in
    *i*) ;;
      *) return;;
esac

Taj blok prekida fajl kad shell nije interaktivan i štiti scp i rsync od tvojih ispisa.

Primena bez odjave, posle svake izmene:

$ source ~/.bashrc

Prompt

Podrazumevani prompt izgleda ovako:

alen@server:~/projekti/sajt$

Definiše ga promenljiva PS1:

$ echo $PS1
\u@\h:\w\$

Oznake koje ćeš koristiti:

\u korisničko ime
\h / \H ime mašine, kratko / puno
\w / \W cela putanja / samo poslednji direktorijum
\t vreme, 24-časovno
\$ # za roota, $ za ostale
\n prelazak u novi red

Boje

PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '

Izgleda neprijatno, ali ima samo tri dela: \e[32m uključuje zelenu, \e[34m plavu, \e[0m vraća na normalno.

Uglaste zagrade \[ i \] su obavezne. One bashu govore da ti znakovi ne zauzimaju mesto na ekranu. Bez njih shell pogrešno računa dužinu reda, pa se pri listanju istorije tekst preklapa i briše — čest i vrlo neprijatan kvar.

Brojevi boja: 31 crvena, 32 zelena, 33 žuta, 34 plava, 35 ljubičasta, 36 cijan. Dodavanje 1; daje svetliju varijantu: \e[1;32m.

Prompt koji ti kaže da si na tuđem serveru

Crveno kad si root, zeleno inače:

if [ "$EUID" -eq 0 ]; then
    PS1='\[\e[1;31m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]# '
else
    PS1='\[\e[1;32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\$ '
fi

Ovo je najkorisnija stvar na celoj stranici. Kad prompt pocrveni, znaš da svaka komanda ide sa punim pravima — i rm se kuca pažljivije.

Slično vredi i razlikovanje mašina: na produkcionom serveru drugačija boja nego na svom laptopu, pa restart ne odleti na pogrešnom mestu.

Status prethodne komande

PS1='$(if [ $? -ne 0 ]; then echo "\[\e[31m\]✗\[\e[0m\] "; fi)\u@\h:\w\$ '

Ako je prethodna komanda pukla, pred promptom stoji crveni znak. Korisno kod komandi koje ne ispisuju ništa kad ne uspeju.

Prompt u dva reda

PS1='\[\e[32m\]\u@\h\[\e[0m\]:\[\e[34m\]\w\[\e[0m\]\n\$ '

Duboke putanje pojedu pola ekrana. Sa prelaskom u novi red komanda uvek počinje na istom mestu, a kopiranje ispisa je čistije.

Ostali promptovi

PS2='> '        # nastavak nedovršene komande
PS4='+ '        # ispred svake linije kod bash -x

Podešavanje PS4='+ ${BASH_SOURCE}:${LINENO}: ' pri traženju kvara u skripti pokazuje i fajl i broj reda.

Istorija

Podrazumevana podešavanja gube dosta toga. Ovih šest redova rešava većinu:

HISTSIZE=50000
HISTFILESIZE=100000
HISTCONTROL=ignoreboth:erasedups
HISTTIMEFORMAT="%d.%m.%Y %H:%M  "
HISTIGNORE="ls:ll:cd:pwd:clear:exit:history"
shopt -s histappend

Šta koji radi:

  • HISTSIZE i HISTFILESIZE — koliko komandi u memoriji i u fajlu. Podrazumevanih 500 nestane za dva dana.
  • ignoreboth — ne pamti duplikate zaredom ni komande koje počinju razmakom. Drugo je korisno: kucni razmak pre komande sa lozinkom i neće završiti u istoriji.
  • erasedups — briše starije pojave iste komande.
  • HISTTIMEFORMAT — dodaje vreme uz svaku stavku. Neprocenjivo kad tražiš šta si radio prošle nedelje.
  • HISTIGNORE — smeće koje samo zatrpava.
  • histappend — dopisivanje umesto prepisivanja. Bez njega poslednja zatvorena sesija pregazi istoriju svih ostalih.

Deljenje istorije između prozora

PROMPT_COMMAND="history -a; history -c; history -r"

Komanda kucana u jednom terminalu odmah je dostupna u drugom. Korisno ako radiš u više prozora ili u tmux sesiji.

Napomena: ovo pomera brojeve stavki, pa oblik !247 postaje nepouzdan. Ako ga koristiš, preskoči ovaj red.

Pretraga istorije strelicama

U fajl ~/.inputrc:

"\e[A": history-search-backward
"\e[B": history-search-forward

Otkucaš ssh i pritisneš strelicu gore — dobijaš samo prethodne komande koje počinju sa ssh, umesto celokupne istorije. Ovo je podešavanje koje najbrže menja svakodnevni rad.

Detaljnije o samoj komandi na stranici history.

Aliasi

Pravilo: alias za skraćivanje, funkcija za sve što ima argumente ili logiku.

# bezbednije brisanje i kopiranje
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# listanje
alias ll='ls -alhF'
alias lt='ls -ltrh'
alias l.='ls -d .* --color=auto'

# kretanje
alias ..='cd ..'
alias ...='cd ../..'

# svakodnevno
alias df='df -h'
alias free='free -h'
alias grep='grep --color=auto'
alias ports='ss -tulpn'
alias myip='curl -s ifconfig.me'

Oko rm -i postoji neslaganje, i s razlogom: navikneš se da te sistem pita, pa na tuđem serveru gde tog aliasa nema obrišeš nešto bez pitanja. Sigurnija varijanta je zaseban alias:

alias rmi='rm -i'

Zaobilaženje aliasa kad ti smeta, sa obrnutom kosom crtom:

$ \rm mnogo-fajlova/*

Više o njima na stranici alias.

Funkcije

Ovo je ono što alias ne može.

Direktorijum i ulazak u njega

mkcd() {
    mkdir -p "$1" && cd "$1"
}
$ mkcd projekti/novi/test
$ pwd
/home/alen/projekti/novi/test

Univerzalno raspakivanje

raspakuj() {
    if [ ! -f "$1" ]; then
        echo "Fajl ne postoji: $1"
        return 1
    fi
    case "$1" in
        *.tar.gz|*.tgz)  tar -xzf "$1"   ;;
        *.tar.xz)        tar -xJf "$1"   ;;
        *.tar.bz2)       tar -xjf "$1"   ;;
        *.tar)           tar -xf  "$1"   ;;
        *.gz)            gunzip   "$1"   ;;
        *.zip)           unzip    "$1"   ;;
        *)               echo "Nepoznat format: $1"; return 1 ;;
    esac
}

Više o formatima na stranici gzip, bzip2 i xz.

Kopija fajla pre izmene

bak() {
    cp "$1" "$1.$(date +%Y%m%d-%H%M).bak"
}

Pretraga po sadržaju

nadji() {
    grep -rn --color=auto "$1" . 2>/dev/null
}

Šta drži port zauzetim

port() {
    sudo ss -tulpn | grep ":$1"
}

Navodnici oko $1 su obavezni u svakoj od ovih funkcija. Bez njih puca čim ime sadrži razmak — razlog je objašnjen u lekciji Džokeri i navodnici.

Podešavanja shell-a

# ispravlja sitne greške u kucanju kod cd
shopt -s cdspell

# provera veličine prozora posle svake komande
shopt -s checkwinsize

# ** pogađa i poddirektorijume
shopt -s globstar

# ne prekidaj pri neuspelom šablonu
shopt -s nullglob

Sa globstar radi ovo:

$ ls **/*.log
app/logovi/greske.log
servis/dnevni/2026-08-22.log

Pretraga kroz celo stablo bez find, za jednostavne slučajeve.

PATH i sopstvene skripte

if [ -d "$HOME/bin" ] && [[ ":$PATH:" != *":$HOME/bin:"* ]]; then
    PATH="$HOME/bin:$PATH"
fi

Provera pre dodavanja nije preterivanje. Bez nje se putanja duplira svaki put kad se fajl pročita — a u tmux-u se čita pri svakom novom prozoru, pa posle sat vremena PATH ima deset istih unosa.

Ovaj red ide u ~/.bash_profile, ne u ~/.bashrc, jer se promenljive nasleđuju. Podela je objašnjena u lekciji Login skripte.

Razdvajanje na više fajlova

Kad .bashrc pređe stotinak redova, postaje nepregledan:

for f in ~/.bashrc.d/*.sh; do
    [ -r "$f" ] && source "$f"
done
unset f
$ ls ~/.bashrc.d/
aliasi.sh  funkcije.sh  prompt.sh  putanje.sh

Lakše se održava, lakše se nosi na drugu mašinu, i lako se privremeno isključi jedan deo — samo mu promeniš nastavak.

Provera pre nego što se osloniš

$ bash -n ~/.bashrc
$ echo $?
0

Provera sintakse bez izvršavanja. Ako ipak nešto pukne, a nemaš otvorenu sesiju:

$ ssh -t server /bin/sh
$ mv ~/.bashrc ~/.bashrc.pokvaren
$ cp ~/.bashrc.bak ~/.bashrc

Zato je kopija sa početka ove stranice bila važna.

Prenos na drugu mašinu

Podešavanja koja ti štede vreme na jednoj mašini vrede i na ostalim. Dva pristupa:

$ scp ~/.bashrc server:~/

Ili ozbiljnije, kroz git repozitorijum sa svim konfiguracijama, pa na svakoj novoj mašini samo kloniraš. Traži malo postavljanja, ali se isplati čim imaš tri mašine.

Ali: ne oslanjaj se na to da su podešavanja svuda. Na tuđem serveru, u kontejneru i u režimu za oporavak nemaš ništa od ovoga. Zato uz svaki alias znaj i komandu koju skraćuje — isto pravilo kao kod vi-ja.

Kratka referenca

  • PS1 — prompt · \u \h \w \t \$ \n · boje uz obavezne \[ \]
  • HISTSIZE, HISTFILESIZE — veličina istorije
  • HISTCONTROL=ignoreboth:erasedups — bez duplikata i bez komandi sa vodećim razmakom
  • HISTTIMEFORMAT — vreme uz svaku stavku
  • shopt -s histappend — dopisivanje istorije
  • shopt -s cdspell globstar checkwinsize
  • ~/.inputrc — pretraga istorije strelicama
  • source ~/.bashrc — primeni izmene
  • bash -n ~/.bashrc — provera sintakse
  • \komanda — zaobiđi alias

Vežba

Prvo napravi kopiju i otvori drugu sesiju.

  1. Podesi prompt tako da bude crven kad radiš kao root, pa proveri sa sudo -i.
  2. Uključi vremenske oznake u istoriji i proveri ispis komande history.
  3. Napravi funkciju koja prima ime direktorijuma, pravi ga i ulazi u njega. Testiraj je sa imenom koje sadrži razmak.
  4. Podesi strelice da pretražuju istoriju po početku komande.
  5. Razdvoj svoja podešavanja u ~/.bashrc.d/ i proveri da sve i dalje radi posle otvaranja nove sesije.

Treći zadatak sa razmakom u imenu pokazuje zašto su navodnici oko $1 obavezni.


Koji se fajl kad čita, objašnjeno je u lekciji Login skripte. Prečice za komande su na stranici alias, a pisanje sopstvenih skripti u serijalu Bash skripte.

Cela lekcija je deo vodiča 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