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+Ra 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 arrowzobrazíte předchozí příkaz a stisknutím klávesy Enter jej provedete. - Zadejte
!!a z příkazového řádku stiskněte enter - Zadejte
!-1a z příkazového řádku stiskněte enter. - Stiskněte
Control+Pzobrazí 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.