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 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!