Spuštění Bashe
Bash může být spuštěn v několika režimech. Nejdůležitější z nich jsou:
přihlašovací (login) – pokud je spuštěn s parametrem --login nebo nultý poziční parametr začíná pomlčkou (není to např. jméno souboru);
interaktivní – mezi parametry jsou jen přepínače (ne třeba jména souborů) jiné než -c nebo kdykoli, kdy je mezi parametry -i .
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ů.