Bash ve výchozím stavu při svém ukončování ukládá historii příkazů do souboru bash_history
v domovském adresáři uživatele. Co řádek, to jeden zadávaný příkaz včetně všech parametrů a argumentů. To významně usnadňuje uživateli život, protože je možné se snadno vrátit k předchozím akcím, upravit je a znovu spustit.
Velká část uživatelů končí u toho, že se lze v historii pohybovat pomocí šipek nahoru a dolů. Je toho ale mnohem víc, co se dá s historií dělat.
Vyhledávání
Historie v Bashi umí například fulltextové vyhledávání. K tomu slouží klávesová zkratka Ctrl-R, po jejímž stisknutí na vás vyskočí vyhledávací řádek. Do něj stačí zapisovat libovolný řetězec, který jste v minulosti do příkazové řádky zadali. Může ležet klidně uprostřed řádku, takže může jít například o část cesty, se kterou jste pracovali.
Bash zobrazí nejmladší příkaz, který daný řetězec obsahuje. Pokud chcete vidět starší, opět stiskněte Ctrl-R a posunete se o jeden krok do minulosti. Pokud jste našli, co jste hledali, můžete stisknout Enter a příkaz spustit znovu, případně můžete šipkou doprava přejít k editaci vyhledaného řádku.
Zopakování argumentu
Představte si běžnou situaci: pomocí ls -l
jste zjistili velikost souboru, který leží někde hluboko v adresářovém stromu. Rozhodli jste se, že je to ten, který chcete smazat. Chcete tedy na stejnou cestu zavolat příkaz rm
. Máte samozřejmě více možností, můžete editovat původní příkaz nebo se můžete vrátit k předchozímu argumentu.
To zařídíte tak, že na prázdný řádek napíšete rm
a poté stisknete Alt-. (alt tečka). Bash na místo kurzoru doplní poslední argument předchozího příkazu. Pokud potřebujete poslední argument před-předchozího nebo staršího příkazu, prostě stále mačkáte Alt-. a Bash vám pod rukama argumenty vyměňuje. Pak už stačí jen stisknout Enter.
Vykřičník!
Pro návrat k předchozím příkazům lze jednoduše použít také znak vykřičník. Dva za sebou jednoduše spustí předchozí příkaz, to je poměrně známá věc. Tento zástupný řetězec lze ale použít v libovolném místě řádky, takže pokud při volání balíčkovacího systému zapomenete předřadit sudo
a dostanete vynadáno, stačí jednoduše do prázdného řádku zapsat
$ sudo !!
Vykřičník ale umí i vyhledávat, stačí za něj zapsat začátek některého z předchozích příkazů a on jej rád znovu provede.
$ !una uname -a Linux masina 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.6-1~bpo9+1 (2018-09-13) x86_64 GNU/Linux
Kromě toho je možné s vykřičníkem cestovat také přesně po krocích, pokud víte, v jakém pořadí jste příkazy volali. Například !-1
zavolá poslední příkaz, analogicky !-2
zavolá předposlední a tak dále.
Právo zapomenout
Bash za normálních okolností ukládá do historie všechny příkazy, které odesíláte. Ne vždy je to ale to, co chcete. Výchozí chování totiž ukládá spoustu duplicit a nedovoluje jednoduše některý příkaz neuložit. To lze snadno změnit zadáním proměnné HISTCONTROL=
do souboru .bashrc
v domovském adresáři.
Ta má čtyři volby: ignorespace
neuloží do historie příkazy začínající mezerou, ignoredups
neuloží duplicitní příkaz už jednou v historii uložený, ignoreboth
je zkratkou pro obě předchozí volby a erasedups
duplicitní řádek uloží, ale promaže jeho předchozí výskyty v historii. Pokud chcete v proměnné uvést více variant, oddělte je dvojtečkou.
Ignoruj tenhle příkaz
Spouštíte dokola určitou sadu příkazů, která vám pak v historii překáží a vy ji tam nechcete? Bash umí pracovat se seznamem příkazů, které prostě chcete ignorovat. K tomu slouží proměnná HISTIGNORE=
uložená opět v .bashrc
. Té předáte dvojtečkami oddělený seznam kříkazů, které do historie ukládat nechcete.
HISTIGNORE=ls:history:pwd
Kratší či delší
Bash ve výchozím stavu ukládá 500 nejnovějších příkazů, což pro někoho může být málo, ale pro jiného zase zbytečně hodně. Ovlivnit je to možné proměnnou HISTSIZE=
obsahující celé číslo s počtem uložených záznamů. Pokud do něj uložíte nulu, historie se nebude ukládat vůbec.
HISTSIZE=10000
Kdy jsem to dělal?
Historie v Bashi je obvykle ukládána jednoduše za sebou, jak jste příkazy psali. Občas se ale hodí zjistit, kdy přesně jste vy nebo někdo jiný daný příkaz použili. K nastavení ukládání časových značek slouží proměnná HISTTIMEFORMAT=
obsahující formátovací řetězec. Ten se může skládat z následujících položek:
- y: dvouciferý rok
- Y: čtyřciferný rok
- m: dvouciferný měsíc
- d: dvouciferný den v měsíci
- T: čas ve 24hodinovém formátu
- %r: datum s 12hodinovým časem
- %D: datum ve formátu mm/dd/yy
Do .bashrc
tak můžete zapsat například:
HISTTIMEFORMAT="%h %d %H:%M:%S "
Záznam v historii bude potom vypadat následovně:
34 Jun 08 12:31:10 ls -l 35 Jun 08 12:31:19 uname -a 36 Jun 08 12:31:22 pwd