The '!'
simbol ili operator u Linuxu mogu se koristiti kao Logička negacija operator, kao i za dohvaćanje naredbi iz povijesti s ugađanjima ili za pokretanje prethodno pokrenute naredbe s izmjenama. Sve naredbe u nastavku eksplicitno su provjerene u bash Shell -u. Iako nisam provjerio, ali većina njih neće raditi u drugoj ljusci. Ovdje idemo u nevjerojatnu i tajanstvenu uporabu '!'
simbol ili operator u naredbama Linuxa.
Možda niste svjesni činjenice da naredbu možete pokrenuti iz datoteke povijesti naredba (već/ranije izvršene naredbe). Za početak prvo pronađite broj naredbe pokretanjem 'povijesti‘Naredba.
$ povijest.
Sada pokrenite naredbu iz povijesti samo po broju na kojem se pojavljuje, u izlazu od povijesti. Recimo da pokrenete naredbu koja se prikazuje pod brojem 1551 u ispisu 'povijesti‘Naredba.
$ !1551.
Pokreće naredbu (gornja naredba u gornjem slučaju), to je navedeno pod brojem 1551. Ovaj način za dohvaćanje već izvršene naredbe vrlo je koristan, posebno u slučaju onih naredbi koje su dugačke. Samo ga trebate nazvati pomoću
! [Broj pod kojim se pojavljuje u izlazu naredbe za povijest].Možete pokrenuti one naredbe koje ste prethodno pokrenuli prema njihovom redoslijedu izvođenja jer će zadnja naredba pokretanja biti predstavljena kao -1, zadnji posljednji kao -2, sedmi posljednji kao -7,….
Prva vožnja povijesti naredba za dobivanje popisa posljednje izvedene naredbe. Potrebno je trčati povijesti naredbu, tako da možete biti sigurni da ne postoji naredba poput rm naredba> datoteka
i drugi samo kako biste bili sigurni da niste slučajno izvršili bilo koju opasnu naredbu. Zatim provjerite Šesta posljednja naredba, Osma posljednja naredba i Deseta posljednja naredba.
$ povijest. $ !-6. $ !-8. $ !-10.
Moram navesti sadržaj direktorija '/home/$USER/Binary/firefox‘Pa sam pucao.
$ ls/home/$ USER/Binary/firefox.
Tada sam shvatio da sam trebao pucati 'ls -l'Da vidim koja je datoteka tamo izvršna? Pa bih li trebao ponovno upisati cijelu naredbu! Ne, ne trebam. Samo moram prenijeti posljednji argument ovoj novoj naredbi kao:
$ ls -l! $
Ovdje !$
će prenijeti argumente proslijeđene u zadnjoj naredbi ovoj novoj naredbi.
Recimo da sam stvorio tekstualnu datoteku 1.txt na radnoj površini.
$ touch /home/avi/Desktop/1.txt.
a zatim ga kopirajte u '/home/avi/Downloads'Koristeći potpuni put s obje strane s k.č naredba.
$ cp /home/avi/Desktop/1.txt/home/avi/preuzimanja.
Sada smo donijeli dva argumenta s k.č naredba. Prvo je '/home/avi/Desktop/1.txt'A drugo je'/home/avi/Downloads‘, Dopustimo da se s njima postupa drugačije, samo izvršite echo [argumenti]
za različit ispis oba argumenta.
$ echo "Prvi argument je:!^" $ echo "Drugi argument je:! cp: 2"
Napomena Prvi argument se može ispisati kao “!^”
a ostali se argumenti mogu ispisati izvršavanjem "! [Naziv_ Naredbe]: [Broj_argumenta]"
.
U gornjem primjeru prva naredba bila je 'k.č'I za ispis je bio potreban drugi argument. Stoga "! Cp: 2"
, ako neka naredba kaže xyz se pokreće s 5 argumenata i trebate dobiti četvrti argument, možete koristiti "! Xyz: 4"
, i koristite ga kako želite. Svim argumentima može se pristupiti putem “!*”
.
Zadnju izvršenu naredbu možemo izvršiti na temelju ključnih riječi. Možemo to razumjeti na sljedeći način:
$ ls /home> /dev /null [Naredba 1] $ ls -l/home/avi/Desktop>/dev/null [Naredba 2] $ ls -la/home/avi/Preuzimanja>/dev/null [Naredba 3] $ ls -lA /usr /bin> /dev /null [Naredba 4]
Ovdje smo koristili istu naredbu (ls) ali s različitim prekidačima i za različite mape. Štoviše, poslali smo izlaz svake naredbe na '/dev/null'Budući da se nećemo baviti izlazom naredbe, i konzola ostaje čista.
Sada izvršite naredbu zadnjeg pokretanja na temelju ključnih riječi.
$! ls [Naredba 1] $! ls -l [Naredba 2] $! ls -la [Naredba 3] $! ls -lA [Naredba 4]
Provjerite izlaz i zapanjit ćete se što upravo izvršavate već izvršene naredbe ls
ključne riječi.
Možete pokrenuti/promijeniti zadnju naredbu pokretanja pomoću (!!)
. Pozvat će zadnju naredbu pokretanja s izmjenom/ugađanjem u trenutnoj naredbi. Pokažimo vam scenarij
Prošli dan sam pokrenuo jednoslojnu skriptu kako bih dobio svoj privatni IP, pa sam pokrenuo,
$ ip addr show | grep inet | grep -v 'inet6' | grep -v '127.0.0.1' | awk '{print $ 2}' | izrezati -f1 -d/
Onda sam odjednom shvatio da moram preusmjeriti izlaz gornje skripte u datoteku ip.txt, što bih trebao napraviti? Trebam li ponovno upisati cijelu naredbu i preusmjeriti izlaz u datoteku? Jednostavno rješenje je korištenje GORE
navigacijsku tipku i dodaj '> ip.txt'
preusmjeriti izlaz u datoteku kao.
$ ip addr show | grep inet | grep -v 'inet6' | grep -v '127.0.0.1' | awk '{print $ 2}' | izrezati -f1 -d/> ip.txt.
Hvala životnom Spasitelju GORE
navigacijski ključ ovdje. Sada uzmite u obzir donji uvjet, sljedeći put kad budem trčao ispod skripte s jednom linijom.
$ ifconfig | grep "inet addr:" | awk '{print $ 2}' | grep -v '127.0.0.1' | izrezati -f2 -d:
Čim pokrenem skriptu, bash upit vratio je grešku s porukom "Bash: ifconfig: naredba nije pronađena"
, Nije mi bilo teško pogoditi da ovu naredbu pokrećem kao korisnik gdje bi se trebala izvoditi kao root.
Dakle, koje je rješenje? Teško se prijaviti na root i zatim ponovno upisati cijelu naredbu! Također (Navigacijski ključ GORE) u posljednjem primjeru ovdje nije došao spasiti. Tako? Moramo nazvati “!!”
bez navodnika, koja će pozvati zadnju naredbu za tog korisnika.
$ su -c "!!" korijen.
Ovdje su je korisnik switch koji je root, -c
je pokrenuti određenu naredbu kao korisnik i najvažniji dio !!
će se zamijeniti naredbom, a ovdje će se zamijeniti naredba posljednjeg pokretanja. Da! Morate unijeti root lozinku.
Ja koristim !!
uglavnom u sljedećim scenarijima,
1. Kad trčim apt-get naredbu kao normalan korisnik, obično dobijem pogrešku govoreći da nemate dopuštenje za izvršavanje.
$ apt-get upgrade && apt-get dist-upgrade.
Opps pogreška... ne brinite, izvršite naredbu ispod kako biste uspjeli.
$ su -c!!
Na isti način na koji ja radim,
$ service apache2 start. ili. $ /etc/init.d/apache2 početak. ili. $ systemctl pokrenite apache2.
OOPS Korisnik nije ovlašten za obavljanje takvog zadatka, pa pokrećem ..
$ su -c 'usluga apache2 početak' ili. $ su -c '/etc/init.d/apache2 početak' ili. $ su -c 'systemctl start apache2'
The !
(Logično NE) može se koristiti za pokretanje naredbe na svim datotekama/ekstenzijama osim one iza '!'
.
A. Uklonite sve datoteke iz direktorija osim onog čiji je naziv 2.txt.
$ rm! (2.txt)
B. Uklonite sve vrste datoteka iz mape osim one čiji je nastavak ‘pdf‘.
$ $ rm! (*. pdf)
Ovdje ćemo koristiti '! -d '
za provjeru postoji li direktorij ili ne slijedi Logical AND Operator (&&)
za ispis tog imenika ne postoji i Logical OR Operator (||)
za ispis direktorija je prisutan.
Logika je kad izlaz [! -d/home/avi/Tecmint]
je 0, izvršit će ono što je izvan logičkog I inače će otići u logičko ILI (||)
i izvršiti ono što je izvan logičkog ILI.
$ [! -d/home/avi/Tecmint] && printf '\ nne postoji takav/home/avi/Tecmint direktorij \ n' || printf '\ n/home/avi/direktorij Tecmint postoji \ n'
Slično prethodnom uvjetu, ali ovdje ako željeni direktorij ne postoji izaći će iz naredbe.
$ [! -d/home/avi/Tecmint] && izlaz.
Opća implementacija u skriptnom jeziku gdje će, ako željeni direktorij ne postoji, stvoriti jedan.
[! -d/home/avi/Tecmint] && mkdir/home/avi/Tecmint.
To je sve za sada. Ako znate ili ste naišli na neku drugu upotrebu '!'
što vrijedi znati, možda biste nam željeli dati svoj prijedlog u povratnim informacijama. Ostanite povezani!