10 fantastiske og mystiske bruk av (!) symbol eller operatør i Linux-kommandoer


!-symbolet eller operatoren i Linux kan brukes som logisk negasjonsoperator så vel som for å hente kommandoer fra historikken med justeringer eller for å kjøre tidligere kjørte kommandoer med modifikasjon. Alle kommandoene nedenfor har blitt sjekket eksplisitt i bash Shell. Selv om jeg ikke har sjekket, men en stor av disse vil ikke kjøre i annet skall. Her går vi inn på den fantastiske og mystiske bruken av ! symbol eller operator i Linux-kommandoer.

Du er kanskje ikke klar over det faktum at du kan kjøre en kommando fra historikkkommandoen din (allerede/tidligere utførte kommandoer). For å komme i gang, finn først kommandonummeret ved å kjøre 'historikk'-kommandoen.

$ history

Kjør nå en kommando fra historien bare etter nummeret den vises på, i utdataene til historien. Si kjør en kommando som vises ved nummer 1551 i utdataene til 'historikk'-kommandoen.

$ !1551

Og den kjører kommandoen (toppkommandoen i tilfellet ovenfor), som ble oppført på nummer 1551. Denne måten å hente allerede utførte kommandoer på er veldig nyttig, spesielt i tilfelle av kommandoer som er lange. Du trenger bare å kalle det ved å bruke ![Nummeret som det vises i utdata fra historiekommandoen].

Du kan kjøre de kommandoene du har kjørt tidligere ved at deres kjøresekvens er den siste kjøringskommandoen vil bli representert som -1, nest sist som -2, syvende sist som -7, ....

Kjør først historiekommando for å få en liste over sist utførte kommando. Det er nødvendig å kjøre historiekommando, slik at du kan være sikker på at det ikke er noen kommando som rm-kommando > fil og andre bare for å være sikker på at du ikke kjører noen farlige kommandoer ved et uhell. Og merk deretter av for Sjette siste kommando, Åtte siste kommando og tiende siste kommando.

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

Jeg må liste innholdet i katalogen '/home/$USER/Binary/firefox', så jeg sparket.

$ ls /home/$USER/Binary/firefox

Så skjønte jeg at jeg burde ha avfyrt 'ls -l' for å se hvilken fil som er kjørbar der? Så burde jeg skrive hele kommandoen på nytt! Nei jeg trenger ikke. Jeg trenger bare å bære det siste argumentet til denne nye kommandoen som:

$ ls -l !$

Her vil !$ bære argumenter som ble sendt i siste kommando til denne nye kommandoen.

La oss si at jeg opprettet en tekstfil 1.txt på skrivebordet.

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

og kopier den deretter til '/home/avi/Downloads' ved å bruke fullstendig bane på hver side med cp-kommandoen.

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

Nå har vi sendt to argumenter med cp-kommandoen. Det første er ‘/home/avi/Desktop/1.txt’ og det andre er ‘/home/avi/Downloads’, la oss håndtere dem annerledes, bare kjør echo [argumenter] for å skrive ut begge argumentene annerledes.

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

Merk at det første argumentet kan skrives ut som \!^” og resten av argumentene kan skrives ut ved å utføre \![Name_of_Command]:[Number_of_argument]”.

I eksemplet ovenfor var den første kommandoen 'cp' og det andre argumentet var nødvendig for å skrive ut. Derfor \!cp:2, hvis en kommando sier at xyz kjøres med 5 argumenter og du trenger å få det fjerde argumentet, kan du bruke \!xyz:4, og bruk det som du vil. Alle argumentene kan nås med \!*.

Vi kan utføre den sist utførte kommandoen på grunnlag av nøkkelord. Vi kan forstå det som følger:

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

Her har vi brukt samme kommando (ls), men med forskjellige brytere og for forskjellige mapper. Dessuten har vi sendt til utdata for hver kommando til '/dev/null', da vi ikke kommer til å håndtere utdataene fra kommandoen, forblir konsollen ren.

Utfør nå kommandoen siste kjøring på grunnlag av nøkkelord.

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

Sjekk utdataene og du vil bli overrasket over at du kjører allerede utførte kommandoer bare ved ls nøkkelord.

Du kan kjøre/endre den siste kjøringskommandoen ved å bruke (!!). Den vil kalle opp den siste kjøringskommandoen med alter/tweak i gjeldende kommando. La oss vise deg scenariet

Siste dagen kjører jeg et one-liner skript for å få min private IP, så jeg kjører,

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

Så plutselig fant jeg ut at jeg må omdirigere utdataene fra skriptet ovenfor til en fil ip.txt, så hva skal jeg gjøre? Bør jeg skrive inn hele kommandoen på nytt og omdirigere utdataene til en fil? Vel, en enkel løsning er å bruke UP navigasjonstasten og legge til > ip.txt for å omdirigere utdataene til en fil som.

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

Takket være navigasjonstasten for livet Frelser UP her. Vurder nå tilstanden nedenfor, neste gang jeg kjører under one-liner script.

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

Så snart jeg kjører skriptet, returnerte bash-ledeteksten en feil med meldingen \bash: ifconfig: command not found, Det var ikke vanskelig for meg å gjette at jeg kjører denne kommandoen som bruker der den skal kjøres som root.

Så hva er løsningen? Det er vanskelig å logge på root og deretter skrive inn hele kommandoen på nytt! Også (UP-navigasjonstasten) i det siste eksemplet kom ikke for å redde her. Så? Vi må kalle \!!” uten anførselstegn, som vil kalle opp den siste kommandoen for den brukeren.

$ su -c “!!” root

Her er su switch user som er root, -c er å kjøre den spesifikke kommandoen som bruker og den viktigste delen !! vil bli erstattet av kommando og siste kjøringskommando vil bli erstattet her. Ja! Du må oppgi root-passord.

Jeg bruker !! mest i følgende scenarier,

1. Når jeg kjører apt-get-kommandoen som vanlig bruker, får jeg vanligvis en feilmelding som sier at du ikke har tillatelse til å utføre.

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

Opps feil ... ikke bekymre deg utfør kommandoen under for å få den vellykket..

$ su -c !!

På samme måte som jeg gjør for,

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

OOPS Bruker er ikke autorisert til å utføre en slik oppgave, så jeg kjører..

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

! (Logical NOT) kan brukes til å kjøre kommandoen på alle filene/utvidelsen bortsett fra det som er bak !.

A. Fjern alle filene fra en katalog bortsett fra den som heter 2.txt.

$ rm !(2.txt)

B. Fjern alle filtyper fra mappen bortsett fra den filtypen som er 'pdf'.

$ $ rm !(*.pdf)

Her skal vi bruke ! -d for å validere om katalogen eksisterer eller ikke fulgt av Logical AND Operator (&&) for å skrive ut at katalogen ikke eksisterer og Logical OR Operator (||) for å skrive ut katalogen er til stede.

Logikk er når utgangen til [ ! -d /home/avi/Tecmint ] er 0, det vil utføre det som ligger utenfor Logisk OG ellers vil det gå til Logical OR (||) og utføre det som ligger utenfor Logical OR.

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

I likhet med tilstanden ovenfor, men her hvis den ønskede katalogen ikke eksisterer, vil den avslutte kommandoen.

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

En generell implementering i Scripting Language hvor hvis ønsket katalog ikke eksisterer, vil den opprette en.

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

Det er alt for nå. Hvis du kjenner til eller kommer over annen bruk av ! som er verdt å vite, kan det være lurt å gi oss ditt forslag i tilbakemeldingen. Hold kontakten!