Vždy zapomeňte zadat sudo
před příkazem? Museli jste někdy opakovat celý příkaz, protože jste měli překlep? Napadlo vás někdy, že by bylo hezké mít zkratky pro opakování vašich předchozích příkazů? Pokud to zní jako vy, musím se o něco podělit. V tomto článku vám ukážu, jak používat bash bang (!
), které usnadňují opakování příkazů a opravu chyb.
Základy opakování příkazů
Bash poskytuje přístup k seznamu dříve zadaných příkazů, který je známý jako historie příkazů. Hodnota HISTSIZE
proměnná nastavuje počet příkazů, které jsou uloženy ve vašem seznamu historie. Ve výchozím nastavení je tato hodnota 500. Tyto dříve vydané příkazy (známé jako váš seznam historie) jsou uloženy ve vašem souboru historie. Jeho výchozí umístění je ~/.bash_history
a toto umístění je uloženo v proměnné prostředí HISTFILE
.
Příkazy bang (!) pod kapotou zavádějí do vstupního proudu příkazy z vašeho seznamu historie bash. Tato funkce usnadňuje opakování příkazů, nahrazování textu, manipulaci s argumenty a rychlé opravy překlepů v předchozích příkazech.
Příklady opakování příkazů
Zde je několik příkladů toho, co můžete dělat s bash bang.
Opakujte poslední příkaz odpovídající začátku řetězce
Ta rána (!
) následovaný prvním znakem (nebo řetězcem) odpovídajícím příkazu, který chcete spustit, bude opakovat poslední výskyt tohoto příkazu:
$ ls
dir dir1 dir2 file file1 file2 hello.txt
$ !l
ls
dir dir1 dir2 file file1 file2 hello.txt
$ !ls
ls
dir dir1 dir2 file file1 file2 hello.txt
Opakujte poslední shodu kdekoli v řetězci
!?<string>
format dělá totéž jako výše, ale <string>
nemusí být na začátku příkazu:
$ cat hello.txt
Hello world ..!
$ !?hello.txt
cat hello.txt
Hello world ..!
Opakujte příkaz n z historie
Opakování příkazu n z vaší historie bash (odpočítávání shora) je stejně jednoduché jako použití bang s dotyčným číslem:
!10
Opakujte n-tý příkaz z poslední položky historie
Opakování příkazu n z vaší historie bash (počítání ode dna) je stejně jednoduché jako použití bang s mínusem a dotyčným číslem:
!-10
Opakujte poslední příkaz
Pokud existuje jeden příkaz bang, který používám neustále, byl by to !!
. The bang-bang (!!
) příkaz zopakuje poslední příkaz ze seznamu historie, chová se stejně jako !-1
:
$ cat hello.txt
Hello world ..!
$ !!
cat hello.txt
Hello world ..!
Bang-bang (!!
) je užitečné, když potřebujete zopakovat předchozí příkaz nebo pokud potřebujete předponu sudo
nebo výstup potrubí:
$ yum update
Loaded plugins: priorities, update-motd, upgrade-helper
You need to be root to perform this command.
$ sudo !!
sudo yum update
Loaded plugins: priorities, update-motd, upgrade-helper
$ ls
dir dir1 dir2 file file1 file2 hello.txt
$ !! | grep file
ls | grep file
file
file1
file2
$
Opakujte, ale nahraďte řetězec
Často vydávám dlouhé příkazy a znovu je zadávám různými přepínači. Nebo potřebuji znovu zadat příkaz, protože v předchozím příkazu byl překlep. Náhrada řetězce mi to umožňuje bez přepisování celého dlouhého příkazu.
Tohoto výsledku můžeme dosáhnout dvěma způsoby. Jedním z nich je použití:
!!:s^<old>^<new>
Tato struktura nahrazuje řetězec za předchozí příkaz:
$ ls /etc/httpd/conf.d
autoindex.conf notrace.conf php.conf php-conf.7.2 README userdir.conf welcome.conf
$ !!:s^conf.d^conf
ls /etc/httpd/conf
httpd.conf magic
Můžete dokonce udělat totéž s !<string>:s^<old>^<new>
:
$ !l:s^conf^conf.d
ls /etc/httpd/conf.d
autoindex.conf notrace.conf php.conf php-conf.7.2 README userdir.conf welcome.conf
Tato volba je užitečná, když potřebujete provést náhradu řetězce za příkaz, který nebyl nejnovější.
Druhým způsobem, jak můžeme tohoto výsledku dosáhnout, je struktura ^<old>^<new>
. Tento formát nahrazuje řetězce za nejnovější příkaz, podobně jako !!:s^<old>^<new>
:
$ cd /etc/httpd/conf.d
/etc/httpd/conf.d
/etc/httpd/conf.d $ ^conf.d^conf
cd /etc/httpd/conf
/etc/httpd/conf $
Opakujte argumenty příkazu
Často používáme stejné argumenty z předchozího příkazu. Pokud máte dlouhý argument, pravděpodobně jej budete chtít zopakovat s dalším příkazem. Podívejme se na některé příkazy bash bang, které to za nás mohou udělat.
Nejprve formát !:n
zopakuje argument n z předchozího příkazu s 0
jako samotný příkaz:
~/project $ ls -a -l
total 32
drwxrwxr-x 7 user user 4096 Sep 9 20:30 .
drwx------ 16 user user 4096 Sep 9 20:10 ..
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir1
drwxrwxr-x 2 user user 4096 Sep 9 16:02 dir2
drwxrwxr-x 2 user user 4096 Sep 9 20:30 dir3
-rw-rw-r-- 1 user user 0 Sep 9 16:02 file
-rw-rw-r-- 1 user user 0 Sep 5 16:07 .file
-rw-rw-r-- 1 user user 0 Sep 9 16:01 file1
-rw-rw-r-- 1 user user 0 Sep 9 16:01 file2
-rw-rw-r-- 1 user user 16 Sep 9 16:03 hello.txt
drwxrwxr-x 2 user user 4096 Sep 5 16:08 .hidden_dir
-rw-rw-r-- 1 user user 0 Sep 5 16:08 .hidden_file
~/project $ ls !:1
ls -a
. .. dir dir1 dir2 dir3 file .file file1 file2 hello.txt .hidden_dir .hidden_file
Za druhé, !!:$
zopakuje poslední argument z předchozího příkazu. Tento příkaz můžete zkrátit na !$
a $_
:
project $ mkdir dir3
project $ cd !$
cd dir3
project/dir3 $
Můžete se zeptat:"Co když chci použít tuto techniku s příkazem, který jsem vydal dříve, ale ne s tím posledním?" Můžete tak učinit pomocí příkazů bang pomocí buď:
!<command you've issued previously >:$
$ mkdir -p hello/test1/test2
$ ls !mkdir:$
ls hello/test1/test2
nebo:
!<command you've issued previously >:n
$ ls !mk:2
ls hello/test1/test2
Vytisknout příkazy
Někdy možná budete chtít příkaz vytisknout, ale nechcete, aby byl proveden. Tento úkol můžete provést pomocí !:p
:
~/project $ cat hello.txt
Hello world ..!
~/project $ !:p
cat hello.txt
~/project $
Ve skutečnosti můžete vytisknout jakýkoli příkaz ze seznamu historie, aniž byste jej museli provést. Stačí zadat jedno z následujících:
$ !<command>:p
$ !mkdir:p
mkdir -p hello/test1/test2
$ !<string>:p
$ !su:p
sudo yum check-update
$ !mk:p
mkdir -p hello/test1/test2
Vyvolání příkazů pomocí reverse-i-search
Jako správce systému pravděpodobně každý den vydáváte stovky příkazů. Možná budete mít problém si vybavit některé příkazy nebo část jednoho. Zde je další možnost, jak najít ten, který potřebujete.
(reverse-i-search)`<search string>’: <output> (reverse-i-search)`yu': sudo yum check-update
(reverse-i-search)`cd': cd /etc
CTRL+R aktivuje reverse-i-search
, který poskytuje pěknou oblast pro vyhledávání a umožňuje vám snadněji procházet vaší historií.
Závěr
To jsou užitečné bash bang (!
) příkazy, které by měl znát každý správce systému. Tyto příkazy šetří spoustu času a dávají vám možnost rychle opravit chyby příkazů. Přečtěte si více o bash na jeho manuálové stránce pomocí příkazu man bash
.
[Chcete vyzkoušet Red Hat Enterprise Linux? Stáhněte si jej nyní zdarma.]