Výchozí chování historie bashe je nastaveno tak, že uživatel si svoji historii motá v paměti a při odhlášení je zapsána do souboru ~/.bash_history. Pokud ale tento již existuje, je přepsán, takže starší historie je ztracena. Na důležitějších systémech je ale toho chování často nežádoucí, protože chceme mít dokonalý přehled o tom co se dělo. Nejlépe uchovávat historii ze všech sezení, zapisovat do ní ihned po zadání příkazu a vidět v ní, kdy byl jaký příkaz zadán.
.bashrc
Veškeré úpravy budou provedeny v souboru spouštěném při přihlašování do interaktivního shellu. Na deb-based systémech tedy /etc/bash.bashrc, na CentOSu třeba /etc/bashrc nebo adresář /etc/profile.d/. Pokud úpravu chcete použít pro jediného uživatele, použijte ~/.bashrc.
První věc, kterou určitě nastavte, je maximální velikost historie. Ve výchozím stavu si .bash_history pamatuje 500 příkazů a to je, vzhledem k tomu, že budete logovat všechno a odevšud, málo. Ve svém konfiguračním souboru tedy upravte
HISTSIZE=10000
HISTFILESIZE=20000
Proměnná HISTSIZE určuje, kolik příkazů si bude historie pamatovat a proměnná HISTFILESIZE udává maximální počet řádků souboru .bash_history. HISTFILESIZE je dvakrát tak velká jako HISTSIZE proto, že později budeme ukládat i časová razítka k jednotlivým příkazům a ty u každého příkazu sežerou řádek navíc.
Dále příkazem
shopt -s histappend
řeknete bashi, že má do .bash_history přidávat řádky, místo toho, aby jej celý přepisoval.
Bash má šikovnou proměnnou PROMPT_COMMAND, do které můžete uložit příkaz, který se vykonává těsně po zadání příkazu do interaktivního shellu, ale ještě před jeho vykonáním. Tuhle proměnnou využijte tak, že do ní strčte příkaz k vyplivnutí neuložené historie do souboru. Tím docílíte toho, že v .bash_history se prováděný příkaz objeví okamžitě po jeho odpálení a ne až při odhlašování uživatele, jak je tomu ve výchozím nastavení.
PROMPT_COMMAND="history -a"
Nezapomeňte zkontrolovat, zda bashi někdo neřekl, že si některé příkazy může dovolit neukládat. Tohle chování nastavuje proměnná HISTCONTROL. Volby jsou:
- ignorespace - neukládá příkazy předsazené mezerou.
- ignoredups - neukládá opakované příkazy. Když pětkrát po sobě spustíte stejný příkaz, bude uložen jen jednou.
- ignoreboth - kombinuje obě výše uvedená nastavení.
- erasedups - vymazává duplicity. Tedy když spustíte příkazy v pořadí ps,ls,ps, bude ze dvou ps uloženo jen to poslední. V případě ignoredups by byly uloženy obě, protože ignoredups krátí jen stejné příkazy po sobě následující.
Pro logování úplně všeho by tedy neměla být proměnná HISTCONTROL vůbec nastavena.
Jako poslední krok nastavte formát data a času. Do proměnné HISTTIMEFORMAT v klasickém strftime formátu napište, jak si přejete, aby datum vypadalo.
HISTTIMEFORMAT="(%F %T) "
Výsledek
Můj .bashrc vypadá takto:
[ -z "$PS1" ] && return
if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
debian_chroot=$(cat /etc/debian_chroot)
fi
PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
HISTSIZE=10000
HISTFILESIZE=20000
HISTTIMEFORMAT="(%F %T) "
shopt -s histappend
PROMPT_COMMAND="history -a"
export EDITOR="vim"
shopt -s checkwinsize
eval "`dircolors`"
COLOR="--color=auto"
alias ls='ls $COLOR'
alias ll='ls $COLOR -la'
alias l='ls $COLOR -a'
alias grep='grep $COLOR'
a v historii vidím úplně vše, takže v případě, že na svůj systém pustím i někoho jiného (i přesto, že ženské, auta a rootovská práva se nepůjčují) mám perfektní přehled o tom, co a kdy prováděl.
[root@localhost ~]# history
1 (2011-10-26 13:10:53) cd /etc/sysconfig/networking/devices/
2 (2011-10-26 13:10:54) ll
3 (2011-10-26 13:10:57) cd ../profiles
4 (2011-10-26 13:10:58) ll
5 (2011-10-26 13:11:03) ifconfig -a
6 (2011-10-26 13:11:34) halt
7 (2011-10-26 13:13:07) cd /mnt
8 (2011-10-26 13:13:08) ll
9 (2011-10-26 13:13:11) mount -a
10 (2011-10-26 13:13:13) ll
11 (2011-10-26 13:13:14) ll
12 (2011-10-26 13:13:28) mount -t iso9660 /dev/cdrom /mnt
13 (2011-10-26 13:13:30) ll
14 (2011-10-26 13:13:32) cd ..
15 (2011-10-26 13:14:03) history