Když často používáte příkazový řádek Linuxu, efektivní používání příkazu historie může výrazně zvýšit produktivitu.
V Linuxu existuje velmi užitečný příkaz, který vám ukáže všechny poslední příkazy, které byly nedávno použity. Příkaz se jednoduše nazývá history
.
Zobrazit časové razítko
Obvykle, když zadáte history
v příkazovém řádku se ve výchozím nastavení zobrazuje číslo následované příkazy, které jste nedávno použili. Pro účely auditu může být užitečné zobrazit časové razítko spolu s příkazem, jak je uvedeno níže.
Chcete-li povolit časové razítko v history
výstup příkazu, musíte nakonfigurovat HISTTIMEFORMAT
Bash proměnná.
export HISTTIMEFORMAT="%F %T "
history | more
1 2020-06-25 19:02:39 systemctl restart network
2 2020-06-25 19:02:43 exit
3 2020-06-25 19:02:47 id
4 2020-06-25 19:02:56 cat /etc/hosts
Prohledávání historie příkazů
Toto může být vaše nejčastěji používaná funkce history
příkaz . Když jste již provedli velmi dlouhý příkaz, můžete jednoduše prohledat historii pomocí klíčového slova a znovu spustit stejný příkaz, aniž byste jej museli zadávat celý.
- Stiskněte
Control+R
a zadejte klíčové slovo. - Když uvidíte svůj příkaz, stiskněte klávesu Enter, která provede příkaz z historie.
V následujícím příkladu jsem hledal host
, který zobrazil předchozí příkaz cat /etc/hosts
v historii, která obsahovala slovo host
.
(reverse-i-search)`host': cat /etc/hosts
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Někdy chcete upravit příkaz z historie před jeho provedením. Můžete například vyhledat systemctl
, který zobrazí systemctl restart network
z historie příkazů vyberte tento příkaz (stisknutím ESC
klíč) a změňte restart
stop
.
Poté jej spusťte znovu pouhým stisknutím Enter
.
(reverse-i-search)`systemctl': systemctl stop network
systemctl stop network
Opakování posledního provedeného příkazu
Někdy můžete z různých důvodů zopakovat předchozí příkazy. Níže jsou uvedeny 4 různé způsoby opakování posledního provedeného příkazu.
- Použijte
up arrow
zobrazíte předchozí příkaz a stisknutím klávesy Enter jej provedete. - Zadejte
!!
a z příkazového řádku stiskněte enter - Zadejte
!-1
a z příkazového řádku stiskněte enter. - Stiskněte
Control+P
zobrazí předchozí příkaz, stisknutím klávesy Enter jej provedete.
Spustit konkrétní příkaz
V následujícím příkladu, pokud chcete zopakovat příkaz #4, můžete provést !4
jak je uvedeno níže.
history | more
systemctl restart network
exit
id
cat /etc/hosts
!4
cat /etc/hosts
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost server1
::1 localhost.localdomain localhost server1
Spustit předchozí příkaz, který začíná konkrétním slovem
Zadejte !
následovaných několika počátečními písmeny příkazu, který chcete znovu spustit. V následujícím příkladu zadejte !ps
a enter, provede se předchozí příkaz začínající ps
, což je ps aux | grep yp
.
!ps
ps aux | grep yp
root 16947 0.0 0.1 36516 1264 ? Sl 13:10 0:00 ypbind
root 17503 0.0 0.0 4124 740 pts/0 S+ 19:19 0:00 grep yp
Omezit počet položek historie
Toto je řízeno HISTSIZE
a HISTFILESIZE
vestavěné proměnné prostředí Bash. Připojte následující dva řádky ke svému ~/.bashrc
soubor a odhlaste se a poté se znovu přihlaste.
HISTSIZE=1500
HISTFILESIZE=1500
V důsledku toho nyní history
je nastaven na uložení 1500 příkazů.
Změna názvu souboru historie
Ve výchozím nastavení history
je uložen v ~/.bash_history
soubor.
Přidejte následující řádek do .bash_profile
soubor a znovu se přihlaste do prostředí Bash, abyste uložili příkaz history do .my_commandline
namísto .bash_history
soubor.
HISTFILE=/root/.my_commandline
To se používá, když chcete sledovat příkazy prováděné z různých terminálů pomocí různých názvů souboru historie.
Odstranění nepřetržitého opakovaného záznamu z historie
V následujícím příkladu pwd
bylo zadáno třikrát, když děláte historii, můžete vidět všechny 3 její výskyty. Chcete-li odstranit duplicity, nastavte HISTCONTROL
k ignoredups
jak je uvedeno níže.
history | tail -4
44 pwd
45 pwd
46 pwd
47 history | tail -4
export HISTCONTROL=ignoredups
history | tail -3
56 export HISTCONTROL=ignoredups
57 pwd
58 history | tail -4
Vymazat duplikáty v celé historii
ignoredups
zobrazené výše odstraní duplikáty pouze v případě, že se jedná o po sobě jdoucí příkazy. Chcete-li odstranit duplikáty v celé historii, nastavte HISTCONTROL
na erasedups
jak je uvedeno níže.
export HISTCONTROL=erasedups
pwd
systemctl restart network
history | tail -3
38 pwd
39 systemctl restart network
40 history | tail -3
ls -l
systemctl restart network
history | tail -6
35 export HISTCONTROL=erasedups
36 pwd
37 history | tail -3
38 ls -l
39 systemctl restart network
40 history | tail -6
Vynutit historii, aby si nepamatovala konkrétní příkaz
Když spustíte příkaz, můžete zadat history
příkaz ignorovat nastavením HISTCONTROL
ignorespace
a zadáním mezery před příkaz, jak je znázorněno níže.
Vidím spoustu mladších systémových administrátorů, kteří jsou z toho nadšení, protože dokážou skrýt příkaz z historie. Je dobré pochopit, jak ignorespace
funguje. Ale jako osvědčený postup před historií nic záměrně neschovávejte.
export HISTCONTROL=ignorespace
ls -ltr
pwd
systemctl restart network #Note that there is a space at the beginning of service, to ignore this command from history
history | tail -3
67 ls -l
68 pwd
69 history | tail -3
Vymazat celou předchozí historii
Někdy možná budete chtít vymazat celou předchozí history
, ale chcete, aby se historie posouvala dopředu.
history -c
Nahradit slova z příkazů historie
Když prohledáváte history
, možná budete chtít provést jiný příkaz, ale použijte stejný parametr z příkazu, který jste právě hledali.
V příkladu níže !!:$
vedle vi
příkaz získá argument z předchozího příkazu do aktuálního příkazu.
ls nginx.conf
nginx.conf
vi !!:$
vi nginx.conf
V níže uvedeném příkladu !^
vedle příkazu vi získá první argument z předchozího příkazu (tj. cp
příkaz) na aktuální příkaz (tj. vi
příkaz).
cp nginx.conf nginx.conf.bak
vi !^
vi nginx.conf
Nahrazení konkrétního příkazu konkrétním argumentem
V níže uvedeném příkladu !cp:2
hledá předchozí příkaz v historii, který začíná cp a přebírá druhý argument cp a nahradí jej příkazem ls -l, jak je ukázáno níže.
cp ~/longname.txt /really/a/very/long/path/long-filename.txt
ls -l !cp:2
ls -l /really/a/very/long/path/long-filename.txt
V níže uvedeném příkladu !cp:$
hledá předchozí příkaz v historii, který začíná cp a přebírá poslední argument (v tomto případě je to také druhý argument, jak je ukázáno výše) cp a nahradí jej příkazem ls -l, jak je ukázáno níže.
ls -l !cp:$
ls -l /really/a/very/long/path/long-filename.txt
Zakázat používání historie
Pokud chcete deaktivovat history
vše dohromady a nechcete, aby si Bash Shell pamatoval zadané příkazy, nastavte HISTSIZE
na 0, jak je uvedeno níže.
export HISTSIZE=0
Ignorovat konkrétní příkazy z historie
Někdy možná nebudete chtít zahlcovat svou historii základními příkazy, jako je pwd
a ls
. Použijte HISTIGNORE
zadejte všechny příkazy, které chcete v historii ignorovat.
Vezměte prosím na vědomí, že přidání ls
do HISTIGNORE
ignoruje pouze ls
a ne ls -l
. Musíte tedy zadat přesný příkaz, který chcete v historii ignorovat.
export HISTIGNORE="pwd:ls:ls -ltr:"
pwd
ls
ls -l
systemctl restart network
history | tail -3
79 export HISTIGNORE="pwd:ls:ls -l:"
80 systemctl restart network
81 history
[Note that history did not record pwd, ls and ls -l]
Další informace o history
příkaz v systému Linux, podívejte se na stránku jeho příručky.