10 neverjetnih in skrivnostnih uporab (!) Simbola ali operaterja v ukazih za Linux


Simbol ali operater ! v Linuxu se lahko uporablja kot operator logičnega zanikanja, pa tudi za pridobivanje ukazov iz zgodovine s popravki ali zagon predhodno zagnanega ukaza s spremembami. Vsi spodnji ukazi so bili izrecno preverjeni v bash Shell. Čeprav nisem preveril, vendar večina od njih ne bo delovala v drugi lupini. Tu gremo v neverjetno in skrivnostno uporabo simbola ali operaterja ! v ukazih za Linux.

Morda se ne zavedate dejstva, da lahko zaženete ukaz iz zgodovine (že/prej izvedeni ukazi). Za začetek najprej poiščite številko ukaza z zagonom ukaza 'history'.

$ history

Zdaj zaženite ukaz iz zgodovine samo glede na številko, na kateri se prikaže, v izhodu zgodovine. Recimo, zaženite ukaz, ki se na izhodu ukaza 'history' prikaže na številki 1551.

$ !1551

In zažene ukaz (zgornji ukaz v zgornjem primeru), ki je bil naveden na številki 1551. Ta način pridobivanja že izvedenega ukaza je zelo koristen, zlasti v primeru dolgih ukazov. Samo poklicati ga morate z uporabo! [Številka, na kateri je prikazana v izhodu ukaza zgodovine].

Ukaze, ki ste jih prej izvajali, lahko izvajate po njihovem zaporedju, pri čemer je zadnji ukaz predstavljen kot -1, drugi zadnji kot -2, sedmi zadnji kot -7,….

Ukaz zgodovine prvega zagona, da dobite seznam zadnjega ukaza. Zagnati morate ukaz zgodovine, da boste lahko prepričani, da ni ukaza, kot je rm command> datoteka in drugih, samo zato, da slučajno ne zaženete nobenega nevarnega ukaza. Nato preverite Šesti zadnji ukaz, Osem zadnji ukaz in Deseti zadnji ukaz.

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

Našteti moram vsebino imenika ‘/ home/$USER/Binary/firefox’, zato sem sprožil.

$ ls /home/$USER/Binary/firefox

Potem sem spoznal, da bi moral sprožiti 'ls -l', da vidim, katera datoteka je tam izvršljiva? Torej naj spet vtipkam celoten ukaz! Ne, ne rabim. V ta novi ukaz moram prenesti še zadnji argument kot:

$ ls -l !$

Tu bo ! $ vseboval argumente, posredovane v zadnjem ukazu novemu ukazu.

Recimo, da sem na namizju ustvaril besedilno datoteko 1.txt.

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

in ga nato s pomočjo celotne poti na obeh straneh z ukazom cp kopirajte v "/ home/avi/Downloads".

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

Zdaj smo podali dva argumenta z ukazom cp. Prvi je '/home/avi/Desktop/1.txt', drugi pa '/ home/avi/Downloads', omogoča njihovo različno obdelavo, samo izvedite echo [argument] , da oba argumenta natisnete drugače.

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

Opomba 1. argument lahko natisnete kot \"! ^” , ostale argumente pa lahko natisnete z izvajanjem \"! [Name_of_Command]: [Number_of_argument]" .

V zgornjem primeru je bil prvi ukaz "cp", za tiskanje pa je bil potreben 2. argument. Zato \"! Cp: 2" , če katerikoli ukaz pravi, da se xyz zažene s 5 argumenti in morate dobiti 4. argument, lahko uporabite \"! Xyz: 4” , in ga uporabite, kot želite. Do vseh argumentov je mogoče dostopati z \"! *” .

Zadnji izvršeni ukaz lahko izvedemo na podlagi ključnih besed. Razumemo ga lahko na naslednji način:

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

Tu smo uporabili isti ukaz (ls), vendar z različnimi stikali in za različne mape. Poleg tega smo poslali izhodu vsakega ukaza na '/ dev/null', saj se z izhodom ukaza ne bomo ukvarjali, tudi konzola ostane čista.

Zdaj izvršite ukaz zadnjega zagona na podlagi ključnih besed.

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

Preverite izhod in presenečeni boste, da izvajate že izvršene ukaze samo s ključnimi besedami ls .

Ukaz zadnjega zagona lahko zaženete/spremenite s pomočjo (!!) . V trenutnem ukazu bo poklical zadnji ukaz za zagon z alter/tweak. Poglejmo vam scenarij

Zadnji dan sem zagnal skript z eno linijo, da bi dobil svoj zasebni IP, zato sem zagnal,

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

Nato sem nenadoma ugotovil, da moram izhod zgornjega skripta preusmeriti v datoteko ip.txt, kaj naj naredim? Ali naj znova pretipkam celoten ukaz in izhod preusmerim v datoteko? Enostavna rešitev je, da uporabite navigacijsko tipko UP in dodate > ip.txt za preusmeritev izhoda v datoteko kot.

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

Zahvaljujoč navigacijski tipki Rešitelj UP tukaj. Zdaj upoštevajte spodnji pogoj, ko bom naslednjič zagnal spodnji skript z eno linijo.

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

Takoj, ko zaženem skript, je bash poziv vrnil napako s sporočilom \"bash: ifconfig: command not found" , ni mi bilo težko uganiti, da ta ukaz izvajam kot uporabnik, kjer je je treba zagnati kot root.

Torej, kakšna je rešitev? Težko se je prijaviti v root in nato znova vnesti celoten ukaz! Tudi (Navigacijska tipka UP) v zadnjem primeru tukaj ni priskočila na pomoč. Torej? Poklicati moramo \"!!" brez narekovajev, ki bo poklical zadnji ukaz za tega uporabnika.

$ su -c “!!” root

Tu je su preklopi uporabnika, ki je root, -c naj zažene določen ukaz kot uporabnik in najpomembnejši del !! bo nadomestil ukaz in ukaz zadnjega zagona bo zamenjana tukaj. Ja! Navesti morate root geslo.

!! uporabljam večinoma v naslednjih scenarijih,

1. Ko zaženem ukaz apt-get kot običajen uporabnik, ponavadi dobim napako, da nimate dovoljenja za izvajanje.

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

Napaka opps ... brez skrbi izvedite spodnji ukaz, da bo uspešen ..

$ su -c !!

Enako kot za,

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

Uporabnik OOPS ni pooblaščen za izvajanje take naloge, zato tečem ..

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

! (Logical NOT) lahko uporabite za zagon ukaza v vseh datotekah/končnicah, razen za ! .

A. Iz imenika odstranite vse datoteke, razen tiste, katere ime je 2.txt.

$ rm !(2.txt)

B. Iz mape odstranite vse vrste datotek, razen tiste, katere razširitev je „pdf“.

$ $ rm !(*.pdf)

Tukaj bomo uporabili ! -d za potrditev, če imenik obstaja ali mu ne sledi Logični AND Operator (&&) , da natisne, da ta imenik ne obstaja, in Logični ALI Operator (||) za tiskanje imenika je prisoten.

Logika je, ko je rezultat [! -d/home/avi/Tecmint] je 0, izvedel bo tisto, kar je izven logičnega IN drugače bo šel v logično ALI (||) in izvedel tisto, kar je zunaj logičnega ALI.

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

Podobno kot zgornji pogoj, vendar tukaj, če želeni imenik ne obstaja, bo ukaz zapustil.

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

Splošna izvedba v skriptnem jeziku, kjer jo bo ustvaril želeni imenik, če ne obstaja.

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

To je vse za zdaj. Če poznate ali naletite na kakršno koli drugo uporabo ! , ki jo je vredno vedeti, nam boste morda želeli poslati svoj predlog v povratnih informacijah. Bodite povezani!