'!'
symbol nebo operátor v Linuxu lze použít jako logickou negaci operátora a také načíst příkazy z historie pomocí vylepšení nebo spustit dříve spuštěný příkaz s úpravou. Všechny níže uvedené příkazy byly explicitně zkontrolovány v bash Shell. I když jsem to nezkontroloval, většina z nich nepoběží v jiném prostředí. Zde se podíváme na úžasné a tajemné použití '!'
symbol nebo operátor v příkazech systému Linux.
1. Spusťte příkaz z historie podle čísla příkazu.
Možná si nejste vědomi skutečnosti, že můžete spustit příkaz ze své historie příkaz (již/dříve provedené příkazy). Chcete-li začít, nejprve vyhledejte číslo příkazu spuštěním „historie ‘ příkaz.
$ history
Nyní spusťte příkaz z historie pouze podle čísla, u kterého se objeví ve výstupu historie . Řekněme spustit příkaz, který se zobrazí na čísle 1551 ve výstupu ‘historie ‘ příkaz.
$ !1551
A spustí příkaz (ve výše uvedeném případě nejvyšší příkaz), který byl uveden pod číslem 1551 . Tento způsob načtení již provedeného příkazu je velmi užitečný zejména v případě těch příkazů, které jsou dlouhé. Stačí jej zavolat pomocí ![Číslo, pod kterým se objeví ve výstupu příkazu historie] .
2. Spustit dříve provedený příkaz jako 2. poslední příkaz, 7. poslední příkaz atd.
Můžete spouštět ty příkazy, které jste spustili dříve, jejich sekvence běhu bude poslední spuštěný příkaz reprezentován jako -1 , předposlední jako -2 , sedmé předposlední jako -7 ,….
Historie prvního spuštění příkaz k získání seznamu naposledy provedených příkazů. Je nutné spustit historii příkaz, takže si můžete být jisti, že neexistuje žádný příkaz jako rm command > file
a další jen proto, abyste se ujistili, že náhodně nespustíte žádný nebezpečný příkaz. A pak zaškrtněte Šestý poslední příkaz, Osmý poslední příkaz a Desátý poslední příkaz.
$ history $ !-6 $ !-8 $ !-10
3. Předejte argumenty posledního příkazu, který jsme spustili, novému příkazu bez přepisování
Potřebuji vypsat obsah adresáře ‘/home/$USER/Binary/firefox ‘ tak jsem vystřelil.
$ ls /home/$USER/Binary/firefox
Pak jsem si uvědomil, že jsem měl vystřelit ‘ls -l ‘ abyste viděli, který soubor je tam spustitelný? Měl bych tedy napsat celý příkaz znovu! Ne, nepotřebuji. Jen potřebuji přenést poslední argument do tohoto nového příkazu jako:
$ ls -l !$
Zde !$
bude nést argumenty předané v posledním příkazu tomuto novému příkazu.
4. Jak zacházet se dvěma nebo více argumenty pomocí (!)
Řekněme, že jsem vytvořil textový soubor 1.txt na ploše.
$ touch /home/avi/Desktop/1.txt
a poté jej zkopírujte do složky „/home/avi/Downloads ‘ pomocí úplné cesty na obě strany s cp příkaz.
$ cp /home/avi/Desktop/1.txt /home/avi/downloads
Nyní jsme předali dva argumenty s cp příkaz. První je „/home/avi/Desktop/1.txt “ a druhá je „/home/avi/Downloads ‘, pojďme s nimi zacházet jinak, stačí provést echo [arguments]
vytisknout oba argumenty odlišně.
$ echo “1st Argument is : !^” $ echo “2nd Argument is : !cp:2”
Poznámka 1. argument lze vytisknout jako “!^”
a zbytek argumentů lze vytisknout spuštěním “![Name_of_Command]:[Number_of_argument]”
.
Ve výše uvedeném příkladu byl první příkaz „cp “ a k vytištění bylo potřeba 2. argumentu. Proto “!cp:2”
, pokud nějaký příkaz řekněte xyz běží s 5 argumenty a potřebujete získat 4. argument, můžete použít “!xyz:4”
a používejte jej, jak chcete. Všechny argumenty jsou přístupné pomocí “!*”
.
5. Proveďte poslední příkaz na základě klíčových slov
Poslední provedený příkaz můžeme provést na základě klíčových slov. Můžeme to chápat následovně:
$ ls /home > /dev/null [Command 1] $ ls -l /home/avi/Desktop > /dev/null [Command 2] $ ls -la /home/avi/Downloads > /dev/null [Command 3] $ ls -lA /usr/bin > /dev/null [Command 4]
Zde jsme použili stejný příkaz (ls) ale s různými přepínači a pro různé složky. Navíc jsme na výstup každého příkazu odeslali „/dev/null ‘ protože se nebudeme zabývat výstupem příkazu, konzole zůstává čistá.
Nyní Proveďte příkaz posledního spuštění na základě klíčových slov.
$ ! ls [Command 1] $ ! ls -l [Command 2] $ ! ls -la [Command 3] $ ! ls -lA [Command 4]
Zkontrolujte výstup a budete překvapeni, že právě pomocí ls
spouštíte již provedené příkazy klíčová slova.
6. Síla !! Operátor
Příkaz posledního spuštění můžete spustit/změnit pomocí (!!)
. Zavolá příkaz posledního spuštění s alter/tweak v aktuálním příkazu. Ukážeme vám scénář
Minulý den jsem spustil jednořádkový skript, abych získal svou soukromou IP, takže spustím,
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/
Pak jsem najednou zjistil, že musím přesměrovat výstup výše uvedeného skriptu do souboru ip.txt , tak co bych měl dělat? Mám celý příkaz přepsat znovu a přesměrovat výstup do souboru? Snadným řešením je použít UP
navigační klávesu a přidejte '> ip.txt'
přesměrovat výstup do souboru jako.
$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt
Díky Spasiteli života UP
navigační klávesa zde. Nyní zvažte níže uvedenou podmínku, až příště spustím pod jednořádkovým skriptem.
$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:
Jakmile spustím skript, výzva bash vrátila chybu se zprávou “bash: ifconfig: command not found”
, Nebylo pro mě těžké uhodnout, že jsem tento příkaz spustil jako uživatel, kde by měl být spuštěn jako root.
Jaké je tedy řešení? Je těžké se přihlásit do rootu a pak celý příkaz napsat znovu! Také (Navigační klávesa NAHORU ) v posledním příkladu sem nepřišel zachránit. Tak? Musíme zavolat “!!”
bez uvozovek, což zavolá poslední příkaz pro daného uživatele.
$ su -c “!!” root
Zde su je přepnout uživatele, což je root, -c
je spustit konkrétní příkaz jako uživatel a nejdůležitější část !!
bude nahrazen příkazem a zde bude nahrazen příkaz posledního spuštění. To jo! Musíte zadat heslo uživatele root.
Používám !!
většinou v následujících scénářích,
1. Když spustím apt-get jako normální uživatel se mi obvykle zobrazí chyba, že nemáte oprávnění ke spuštění.
$ apt-get upgrade && apt-get dist-upgrade
Chyba Opps… nebojte se spusťte níže uvedený příkaz, aby byl úspěšný..
$ su -c !!
Stejným způsobem jako pro,
$ service apache2 start or $ /etc/init.d/apache2 start or $ systemctl start apache2
OOPS Uživatel nemá oprávnění provádět takový úkol, takže spustím..
$ su -c 'service apache2 start' or $ su -c '/etc/init.d/apache2 start' or $ su -c 'systemctl start apache2'
7. Spusťte příkaz, který ovlivní celý soubor kromě ![FILE_NAME]
!
(Logické NE ) lze použít ke spuštění příkazu na všech souborech/příponách kromě těch, které jsou za '!'
.
A. Odeberte všechny soubory z adresáře kromě toho, jehož název je 2.txt .
$ rm !(2.txt)
B. Odeberte ze složky všechny typy souborů kromě toho, jehož přípona je „pdf ‘.
$ $ rm !(*.pdf)
8. Zkontrolujte, zda adresář (řekněme /home/avi/Tecmint) existuje nebo ne? Printf, zda zmíněný adresář existuje nebo ne.
Zde použijeme '! -d'
pro ověření, zda adresář existuje nebo není následován logickým operátorem AND (&&)
pro tisk tohoto adresáře neexistuje a logický operátor OR (||)
pro tisk je přítomen adresář.
Logika je, když výstup [ ! -d /home/avi/Tecmint ]
je 0 , provede to, co leží za logickými A jinak to půjde do Logical OR (||)
a provádět to, co leží za logickým NEBO .
$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'
9. Zkontrolujte, zda adresář existuje nebo ne? Pokud ne, ukončete příkaz.
Podobné jako výše uvedená podmínka, ale zde, pokud požadovaný adresář neexistuje, příkaz ukončí.
$ [ ! -d /home/avi/Tecmint ] && exit
10. Vytvořte adresář (řekněme test) ve svém domovském adresáři, pokud neexistuje.
Obecná implementace ve skriptovacím jazyce, kde pokud požadovaný adresář neexistuje, vytvoří jej.
[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint
To je prozatím vše. Pokud znáte nebo narazíte na jiné použití '!'
což stojí za to vědět, můžete nám ve zpětné vazbě poskytnout svůj návrh. Zůstaňte ve spojení!