GNU/Linux >> Znalost Linux >  >> Linux

Příkazy Bash bang:Nezbytný trik pro příkazový řádek Linuxu

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

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.]


Linux
  1. 8 tipů pro příkazový řádek Linuxu

  2. Bash tipy pro každý den na příkazovém řádku

  3. Linux Základy příkazového řádku – Spouštění příkazů z příkazového řádku

  1. Mít krávu na příkazovém řádku Linuxu

  2. Yoda – Osobní asistent příkazového řádku pro váš systém Linux

  3. 8 Dílčí příkazy Linux virsh pro správu virtuálních počítačů na příkazovém řádku

  1. 4 Nástroje Markdown pro příkazový řádek Linuxu

  2. Přihlaste se do příkazového řádku Linuxu

  3. Tipy pro výpis souborů s ls na příkazovém řádku Linuxu