24Kapitola

Bash 24: Konfigurační soubory

V tomto předposledním díle seriálu o nejpoužívanějším textovém příkazovém interpretru – Bash – se budeme věnovat jeho konfiguračním souborům. Nejsou totiž ničím jiným než bashovými skripty.

Spuštění Bashe

Bash může být spuštěn v několika režimech. Nejdůležitější z nich jsou:

Interaktivní Bash je samozřejmě takový, který má vstup i výstup nasměrovaný na terminál, takže jej klasicky ovládáme klávesnicí a on zobrazuje výsledky práce a prompt na obrazovce. Opačnou situací je, když byl Bash spuštěn pouze pro provedení skriptu, tedy neinteraktivně. Na způsobu spuštění Bashe závisí, jakým způsobem čte své konfigurační soubory.

Pokud je Bash spuštěn jako interaktivní a přihlašovací nebo jako neinteraktivní s přepínačem --login, provádí příkazy z /etc/profile. Potom Bash hledá postupně ~/.bash_profile, ~/.bash_login a ~/.profile, a pokud existují, provede příkazy v nich uvedené.

Pokud je Bash volán jako interaktivní, a není přitom přihlašovací, načte pouze soubor ~/.bashrc a provede příkazy v něm.

V okamžiku ukončování Bashe, který byl spuštěn jako přihlašovací, hledá a spouští příkazy v souboru ~/.bash_logout .

Pokud některý ze jmenovaných souborů existuje, ale není přístupný pro čtení, Bash to ohlásí jako chybu. Výše popsané způsoby načítání konfiguračních souborů lze měnit různými přepínači. Existují také další, zde nepopsané, způsoby spouštění Bashe. Ukažme si tedy, jak vypadá typický start Bashe na mnou používaném Mandriva Linuxu 2006.

Jak již bylo řečeno v úvodu, všechny výše jmenované konfigurační soubory mají formát bashového skriptu. V některých případech může jít jen o přiřazení hodnot nějakým proměnným, jindy to bude složitý skript s funkcemi, smyčkami a podmínkami.

/etc/profile

Nejprve se provede systémový skript /etc/profile:

loginsh=1

Nastaví proměnnou loginsh, která se nám bude hodit v jiném souboru.

[ "$UID" = "0" ] && ulimit -S -c 1000000 > /dev/null 2>&1

Pro uživatele kromě roota vypne generování tzv. core souborů.

if ! echo ${PATH} |grep -q /usr/X11R6/bin ; then
 PATH="$PATH:/usr/X11R6/bin"
fi

Pokud operace „hledej řetězec /usr/X11R6/bin v obsahu proměnné PATH“ má nulový návratový kód (tj. daný řetězec mezi systémovými cestami není), rozšíří se obsah PATH o tuto cestu.

if [ "$UID" -ge 500 ] && ! echo ${PATH} |grep -q /usr/games ; then
 PATH=$PATH:/usr/games
fi

Obdoba předchozího pro adresář /usr/games, ale provede se jen pro uživatele s UID vyšším než 500, tj. normální uživatelé.

umask 022
USER=`id -un`
LOGNAME=$USER
MAIL="/var/spool/mail/$USER"
HISTCONTROL=ignoredups
HOSTNAME=`/bin/hostname`
HISTSIZE=1000

Nastaví umask a důležité systémové proměnné.

if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then
 INPUTRC=/etc/inputrc
fi

Pokud není nastavena proměnná INPUTRC a neexistuje soubor .inputrc v domovském adresáři, bude nastavena hodnota INPUTRC na /etc/inputrc .

NLSPATH=/usr/share/locale/%l/%N
export PATH PS1 USER LOGNAME MAIL HOSTNAME INPUTRC NLSPATH
export HISTCONTROL HISTSIZE

Nastavení další proměnné a vyexportování důležitých proměnných do systému.

for i in /etc/profile.d/*.sh ; do
       if [ -x $i ]; then
                . $i
       fi
done
unset i

Postupné spuštění všech spustitelných souborů s koncovkou .sh z adresáře /etc/profile.d/ .

bash_profile

Dále se provede soubor .bash_profile z domovského adresáře uživatele:

if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

Ještě bych chtěl připomenout, že ~/.bashrc, a tedy i /etc/bashrc, se spouští také samostatně (bez /etc/profile a ~/.bash_profile), pokud je Bash volán jako interaktivní a přitom ne přihlašovací.

Pokud existuje soubor .bashrc v domovském adresáři, je spuštěn (viz níže).

PATH=$PATH:$HOME/bin

Obsah proměnné PATH je rozšířen o podadresář bin domovského adresáře uživatele.

export PATH
unset USERNAME

Vyexportování nového obsahu proměnné PATH a zrušení proměnné USERNAME. Dále lze do tohoto souboru přidat seznam příkazů a nastavení dle přání uživatele.

/etc/bashrc

Dále by měly být provedeny skripty ~/.bash_login a ~/.profile, které ovšem Mandriva ve standardní konfiguraci nepoužívá. Z .bash_profile byl ovšem spuštěn ještě .bashrc, který nedělá nic jiného než, pokud tento existuje, spustí /etc/bashrc.

if [ "`id -gn`" = "`id -un`" -a `id -u` -gt 99 ]; then
        umask 002
else
        umask 022
fi

Pokud má uživatel UID větší než 99, tj. většinou běžní uživatelé, nastaví se mu umask 002, jinak 022.

if [ "$PS1" ]; then

Následující příkazy se provedou pouze tehdy, je-li Bash spuštěn interaktivně.

    case $TERM in
        xterm*)
            PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD}\007"'
            ;;
        *)
            ;;
    esac

Pokud je terminálem xterm, nastaví se příkaz pro prompt.

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

Nastaví novou podobu promptu PS1.

if [ -z "$loginsh" ]; then

Podle hodnoty proměnné loginsh (nastavené v /etc/profile) zjistíme, zda běží Bash jako přihlašovací.

        if [ -n "${BASH_VERSION}${KSH_VERSION}${ZSH_VERSION}" ]; then
            for i in /etc/profile.d/*.sh; do
                if [ -x $i ]; then
                    . $i
                fi
            done
        fi

Pokud není nastavena ani jedna z proměnných BASH_VERSION, KSH_VERSION nebo ZSH_VERSION, budou postupně spuštěny všechny spustitelné soubory s koncovkou .sh z adresáře /etc/profile.d/ . Následuje ukončení dřívějších podmínek a zrušení proměnné loginsh.

    fi
fi
unset loginsh

Závěr – start

A teprve potom je Bash nastartován. Nutno znovu zdůraznit, že zde uváděný proces se může v různých distribucích značně lišit. Příště, než se s Bashem definitivně rozloučíme, si ukážeme látku probíranou v dřívějších dílech na rozboru jednoho ze systémových skriptů.