10 (!) Symbolin tai Operaattorin hämmästyttävää ja salaperäistä käyttöä Linux-komennoissa


! -symbolia tai -operaattoria Linuxissa voidaan käyttää loogisen negationin operaattorina sekä hakea komentoja historiasta tweaksilla tai suorittaa aiemmin suoritettu komento muutoksella. Kaikki alla olevat komennot on tarkistettu nimenomaisesti bash Shellissä. Vaikka en ole tarkistanut, mutta suurin osa näistä ei toimi toisessa kuoressa. Tässä käsitellään ! -symbolin tai operaattorin hämmästyttäviä ja salaperäisiä käyttötapoja Linux-komennoissa.

Et ehkä ole tietoinen siitä, että voit suorittaa komennon historiakomennostasi (jo/aikaisemmin suoritetut komennot). Aloita etsimällä ensin komentonumero suorittamalla komento historia.

$ history

Suorita nyt komento historiasta vain sen numeron mukaan, jolla se näkyy, historian lähdössä. Sano suorittaa komento, joka näkyy numerossa 1551 historia-komennon lähdössä.

$ !1551

Ja se suorittaa komennon (ylimmän komennon yllä olevassa tapauksessa), joka on lueteltu numerossa 1551. Tämä tapa jo suoritetun komennon noutamiseen on erittäin hyödyllinen erityisesti pitkien komentojen tapauksessa. Sinun tarvitsee vain soittaa sille käyttämällä! [Numero, jolla se näkyy historian komennon tuotoksessa].

Voit suorittaa aikaisemmin suorittamasi komennot siten, että niiden juokseva järjestys on viimeinen ajo-komento, joka esitetään -1, toinen viimeinen kuin -2, seitsemäs viimeinen -7,….

Suorita ensin komento historia saadaksesi luettelon viimeksi suoritetusta komennosta. Historia-komento on suoritettava, jotta voit olla varma, että komentoa, kuten rm command> file ja muita, ei ole, vain sen varmistamiseksi, ettet suorita mitään vaarallista komentoa vahingossa. Ja sitten tarkista kuudes viimeinen, kahdeksan viimeinen ja kymmenes viimeinen komento.

$ history
$ !-6
$ !-8
$ !-10

Minun täytyy luetella hakemiston ”/ home/$USER/Binary/firefox” sisältö, joten ammuin.

$ ls /home/$USER/Binary/firefox

Sitten tajusin, että minun olisi pitänyt laukaista 'ls -l' nähdäksesi mikä tiedosto on suoritettava siellä? Joten minun pitäisi kirjoittaa koko komento uudelleen! Ei, en tarvitse. Minun täytyy vain kuljettaa viimeinen argumentti tähän uuteen komentoon:

$ ls -l !$

Tässä ! $ sisältää viimeisessä komennossa välitetyt argumentit tähän uuteen komentoon.

Oletetaan, että olen luonut tekstitiedoston 1.txt työpöydälle.

$ touch /home/avi/Desktop/1.txt

ja kopioi se sitten hakemistoon// home/avi/Downloads käyttäen täydellistä polkua kummallakin puolella cp-komennolla.

$ cp /home/avi/Desktop/1.txt /home/avi/downloads

Nyt olemme välittäneet kaksi argumenttia cp-komennolla. Ensimmäinen on '/home/avi/Desktop/1.txt' ja toinen on '/ home/avi/Downloads', antaa niiden käsitellä eri tavoin, suorita vain echo [argumentit] tulostaaksesi molemmat argumentit eri tavalla.

$ echo “1st Argument is : !^”
$ echo “2nd Argument is : !cp:2”

Huomautus 1. argumentti voidaan tulostaa muodossa “! ^” ja loput argumentit voidaan tulostaa suorittamalla “! [Name_of_Command]: [Number_of_argument]” .

Yllä olevassa esimerkissä ensimmäinen komento oli ”cp” ja toinen argumentti tarvittiin tulostamiseen. Siksi “! Cp: 2” , jos jokin komento sanoo, että xyz suoritetaan 5 argumentilla ja sinun on saatava neljäs argumentti, voit käyttää “! Xyz: 4” , ja käytä sitä haluamallasi tavalla. Kaikkiin argumentteihin pääsee valitsemalla “! *” .

Voimme suorittaa viimeksi suoritetun komennon avainsanojen perusteella. Voimme ymmärtää sen seuraavasti:

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

Tässä olemme käyttäneet samaa komentoa (ls), mutta eri kytkimillä ja eri kansioille. Lisäksi olemme lähettäneet jokaisen komennon ulostuloon kansioon '/ dev/null', koska emme aio käsitellä komennon lähtöä, myös konsoli pysyy puhtaana.

Suorita nyt viimeinen komento avainsanojen perusteella.

$ ! ls					[Command 1]
$ ! ls -l				[Command 2]	
$ ! ls -la				[Command 3]
$ ! ls -lA				[Command 4]

Tarkista ulostulo ja hämmästyt, että suoritat jo suoritettuja komentoja vain ls -avainsanoilla.

Voit suorittaa/muuttaa viimeisen ajon komennon (!!) -toiminnolla. Se kutsuu viimeisen ajon komennon alter/tweak -toiminnolla nykyisessä komennossa. Näytetään skenaario

Viime päivänä suoritin yhden linjan komentosarjan saadakseni yksityisen IP-osoitteen, joten juon,

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/

Sitten yhtäkkiä tajusin, että minun on ohjattava yllä olevan komentosarjan ulostulo tiedostoon ip.txt, joten mitä minun pitäisi tehdä? Pitäisikö minun kirjoittaa koko komento uudelleen ja ohjata ulostulo tiedostoon? Helppo ratkaisu on käyttää UP -navigointinäppäintä ja lisätä > ip.txt -toiminto ohjaamaan ulostulo tiedostoon nimellä.

$ ip addr show | grep inet | grep -v 'inet6'| grep -v '127.0.0.1' | awk '{print $2}' | cut -f1 -d/ > ip.txt

Kiitos täällä olevan Pelastajan UP -navigointinäppäimen ansiosta. Harkitse nyt seuraavaa ehtoa, kun seuraavan kerran suoritan yhden linjan komentosarjan alapuolella.

$ ifconfig | grep "inet addr:" | awk '{print $2}' | grep -v '127.0.0.1' | cut -f2 -d:

Heti kun suoritin komentosarjan, bash-kehote palautti virheen viestillä “bash: ifconfig: komentoa ei löydy” . Minun ei ollut vaikea arvata, että suoritin tämän komennon käyttäjänä siellä missä sen pitäisi suoritetaan pääkäyttäjänä.

Joten mikä on ratkaisu? On vaikea kirjautua juuriksi ja sitten kirjoittaa koko komento uudelleen! Myöskään (UP-navigointinäppäin) viimeisessä esimerkissä ei tullut pelastamaan täällä. Niin? Meidän on soitettava “!!” ilman lainausmerkkejä, mikä kutsuu kyseisen käyttäjän viimeisen komennon.

$ su -c “!!” root

Tässä su on vaihtaa käyttäjää, joka on root, -c on suoritettava tietty komento käyttäjänä, ja tärkein osa !! korvataan komennolla ja viimeisellä komennolla korvataan täällä. Joo! Sinun on annettava pääsalasana.

Käytän koodia !! enimmäkseen seuraavissa tilanteissa,

1. Kun suoritan apt-get -komennon tavallisena käyttäjänä, saan yleensä virheen sanomalla, että sinulla ei ole lupaa suorittaa.

$ apt-get upgrade && apt-get dist-upgrade

Opps-virhe ... älä huoli suorittamalla alla oleva komento, jotta se onnistuu

$ su -c !!

Samalla tavalla kuin minä,

$ service apache2 start
or
$ /etc/init.d/apache2 start
or
$ systemctl start apache2

OOPS-käyttäjällä ei ole oikeutta suorittaa tällaista tehtävää, joten suoritan ..

$ su -c 'service apache2 start'
or
$ su -c '/etc/init.d/apache2 start'
or
$ su -c 'systemctl start apache2'

! (Looginen EI) -toimintoa voidaan käyttää komennon suorittamiseen kaikissa tiedostoissa/tiedostotunnisteissa lukuun ottamatta ! -taustaa.

A. Poista kaikki tiedostot hakemistosta paitsi se, jonka nimi on 2.txt.

$ rm !(2.txt)

B. Poista kaikki tiedostotyypit kansiosta paitsi se, jonka laajennus on ”pdf”.

$ $ rm !(*.pdf)

Täällä käytämme ! -d vahvistaaksesi, jos hakemistoa on olemassa tai sitä ei seuraa Logical AND Operator (&&) , jos haluat tulostaa kyseisen hakemiston, ei ole olemassa ja Logical OR Operator (||) hakemiston tulostamiseen on käytettävissä.

Logiikka on, kun [! -d/home/avi/Tecmint] on 0, se suorittaa sen, mikä on loogisen takana, JA muuten se siirtyy loogiseen TAI (||) : een ja loogisen OR: n ulkopuolelle.

$ [ ! -d /home/avi/Tecmint ] && printf '\nno such /home/avi/Tecmint directory exist\n' || printf '\n/home/avi/Tecmint directory exist\n'

Samanlainen kuin yllä oleva ehto, mutta tässä, jos haluttua hakemistoa ei ole, se poistuu komennosta.

$ [ ! -d /home/avi/Tecmint ] && exit

Komentosarjakielen yleinen toteutus, jos haluttua hakemistoa ei ole, se luo sellaisen.

[ ! -d /home/avi/Tecmint ] && mkdir /home/avi/Tecmint

Tässä kaikki tältä erää. Jos tiedät tai kohtaat jonkin muun ! -tavan, joka on syytä tietää, voit antaa meille ehdotuksesi palautteessa. Pysy yhteydessä!