10 (!) Sümboli või operaatori hämmastavat ja salapärast kasutamist Linuxi käskudes


Linuxi sümbolit ! saab kasutada nii loogilise eituse operaatorina kui ka käskude toomiseks ajaloost käskude abil või käivitada varem käivitatud käsk muudatustega. Kõiki allolevaid käske on bash Shellis selgesõnaliselt kontrollitud. Kuigi ma pole seda kontrollinud, kuid suurem osa neist ei tööta teises kestas. Siinkohal käsitleme sümboli või operaatori ! hämmastavat ja salapärast kasutamist Linuxi käskudes.

Te ei pruugi olla teadlik asjaolust, et saate käsu käivitada oma ajaloo käsuga (juba/varem täidetud käsud). Alustamiseks leidke kõigepealt käsunumber, käivitades käsu ‘ajalugu’.

$ history

Nüüd käivitage ajaloost pärit käsk ajaloo väljundis ainult numbri järgi, millel see ilmub. Oletame, et käivitate käsu, mis kuvatakse käsu ‘ajalugu’ väljundis numbril 1551.

$ !1551

Ja see käivitab käsu (ülaltoodud juhul ülemine käsk), mis oli loetletud numbril 1551. See viis juba täidetud käsu hankimiseks on eriti kasulik just pikkade käskude korral. Peate sellele lihtsalt helistama, kasutades käsku! [Number, millel see käsu ajalugu väljundis kuvatakse].

Võite käivitada need käsklused, mille olete varem käivitanud, nende käitamisjärjestus, kuna viimane käsk on tähistatud kui -1, teine viimane kui -2, seitsmes viimane kui -7,….

Käivitage kõigepealt ajaloo käsk, et saada viimati täidetud käskude loend. Ajalookäsu on vaja käivitada, nii et võite olla kindel, et pole käsku nagu rm command> file ja teisi, et veenduda, et te ei käivita ühtegi ohtlikku käsku kogemata. Ja siis kontrollige kuuendat käsku, kaheksat käsku ja kümnendat käsku.

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

Pean loetlema kataloogi '/ home/$USER/Binary/firefox' sisu, nii et ma lasin.

$ ls /home/$USER/Binary/firefox

Siis sain aru, et oleksin pidanud tulistama ‘ls -l’, et näha, milline fail on seal käivitatav? Nii et peaksin kogu käsu uuesti tippima! Ei, mul pole vaja. Pean lihtsalt selle uue käsu viimase argumendi kandma järgmiselt:

$ ls -l !$

Siin kannab ! $ viimases käsus antud argumendid uuele käsule.

Oletame, et lõin töölauale tekstifaili 1.txt.

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

ja kopeerige see kausta '/ home/avi/Downloads', kasutades mõlemal küljel täielikku teed käsuga cp.

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

Nüüd oleme andnud kaks argumenti käsuga cp. Esimene on ‘/home/avi/Desktop/1.txt’ ja teine on ‘/ home/avi/Downloads’, võimaldab neid erinevalt käsitseda, lihtsalt käivitage echo [argumentid] mõlema argumendi erinevaks printimiseks.

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

Märkus. Esimese argumendi saab printida kujul \"! ^" ja ülejäänud argumendid saab printida, käivitades \"! [Name_of_Command]: [Number_of_argument]" .

Ülaltoodud näites oli esimene käsk ‘cp’ ja printimiseks oli vaja 2. argumenti. Seega, \"! Cp: 2" , kui mõni käsk ütleb, et xyz käivitatakse 5 argumendiga ja peate saama 4. argumendi, võite kasutada \"! Xyz: 4" ja kasutage seda oma äranägemise järgi. Kõigile argumentidele pääseb juurde aadressil \"! *" .

Viimase täidetud käsu saame täita märksõnade alusel. Me saame sellest aru järgmiselt:

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

Siin oleme kasutanud sama käsku (ls), kuid erinevate lülititega ja erinevate kaustade jaoks. Lisaks oleme saatnud iga käsu väljundisse '/ dev/null', kuna me ei hakka käsu väljundiga tegelema, ka konsool jääb puhtaks.

Nüüd käivitage viimane käsk märksõnade põhjal.

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

Kontrollige väljundit ja olete üllatunud, et käivitate juba täidetud käske lihtsalt märksõnade ls abil.

Viimase käsu saate käivitada/muuta (!!) abil. See kutsub praeguse käsu viimase käsu koos käsu alter/tweak abil. Võimaldab teile stsenaariumi näidata

Eelmisel päeval käitusin ühe liiniga skripti, et saada oma privaatne IP, nii et jooksen,

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

Siis äkki sain aru, et pean ülaltoodud skripti väljundi suunama faili ip.txt, nii et mida ma peaksin tegema? Kas peaksin kogu käsu uuesti tippima ja suunama väljundi faili? Lihtne lahendus on kasutada navigeerimisklahvi UP ja lisada väljund faili ümbersuunamiseks > ip.txt .

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

Tänu siin päästmisnupule Life päästja UP . Mõelge nüüd allpool toodud tingimusele, järgmine kord, kui jooksen allapoole ühe liini skripti.

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

Niipea kui skripti käivitasin, tagastas bashi viip sõnumi \"bash: ifconfig: käsku ei leitud" tõrke. Mul ei olnud raske arvata, et käivitan selle käsu kasutajana tuleks käivitada juurkasutajana.

Mis on lahendus? Juurdestamiseks on keeruline sisse logida ja seejärel kogu käsk uuesti tippida! Samuti ei tulnud viimane näide (UP navigeerimisklahv) siia päästma. Niisiis? Peame helistama \"!!" ilma jutumärkideta, mis kutsub selle kasutaja viimase käsu.

$ su -c “!!” root

Siin on su kasutajat vahetav root, -c on konkreetse käsu käivitamine kasutajana ja kõige olulisem osa !! asendatakse käsuga ja viimane run käsk asendatakse siin. Jah! Peate sisestama juurparooli.

Kasutan valikut !! enamasti järgmiste stsenaariumite korral,

1. Kui käsku apt-get tavakasutajana käivitan, ilmub tavaliselt viga, öeldes, et teil pole täitmiseks luba.

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

Ops viga ... ärge muretsege, et selle õnnestumiseks täitke käsk allpool.

$ su -c !!

Samamoodi nagu

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

OOPS-i kasutajal pole sellist ülesannet volitatud, nii et ma jooksen ..

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

! (Loogiline EI) saab kasutada käsu käivitamiseks kõigil failidel/laienditel, välja arvatud see, mis on ! taga.

A. Eemaldage kataloogist kõik failid, välja arvatud see, mille nimi on 2.txt.

$ rm !(2.txt)

B. Eemaldage kaustast kõik failitüübid, välja arvatud see, mille laiend on ‘pdf’.

$ $ rm !(*.pdf)

Siin kasutame ! -d kinnitamiseks, kui kataloog on olemas või sellele ei järgne Logical AND Operator (&&) , et seda kataloogi printida, pole olemas ja Logical OR Operator (||) kataloogi printimiseks on olemas.

Loogika on siis, kui [! -d/home/avi/Tecmint] on 0, see täidab selle, mis jääb loogilisest kaugemale JA muidu läheb see loogilisse OR (||) ja täidab selle, mis asub väljaspool loogilist OR.

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

Sarnaselt ülaltoodud tingimusega, kuid siin väljub käsk, kui soovitud kataloogi pole.

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

Skriptikeele üldine rakendus, kus soovitud kataloogi pole, siis see luuakse.

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

Praeguseks kõik. Kui teate või leiate mõnda muud koodi ! kasutust, mida tasub teada, võiksite meile oma tagasisides oma soovituse esitada. Hoidke ühendust!