.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 istorijeHISTCONTROL=ignoreboth:erasedups— bez duplikata i bez komandi sa vodećim razmakomHISTTIMEFORMAT— vreme uz svaku stavkushopt -s histappend— dopisivanje istorijeshopt -s cdspell globstar checkwinsize~/.inputrc— pretraga istorije strelicamasource ~/.bashrc— primeni izmenebash -n ~/.bashrc— provera sintakse\komanda— zaobiđi alias
Vežba
Prvo napravi kopiju i otvori drugu sesiju.
- Podesi prompt tako da bude crven kad radiš kao root, pa proveri sa
sudo -i. - Uključi vremenske oznake u istoriji i proveri ispis komande
history. - Napravi funkciju koja prima ime direktorijuma, pravi ga i ulazi u njega. Testiraj je sa imenom koje sadrži razmak.
- Podesi strelice da pretražuju istoriju po početku komande.
- 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
Post a Comment