10 Kahibulongan ug Misteryoso nga Paggamit sa (!) Simbolo o Operator sa Linux Commands


Ang ! nga simbolo o operator sa Linux mahimong gamiton isip Logical Negation operator ingon man sa pagkuha sa mga command gikan sa kasaysayan nga adunay mga tweak o sa pagpadagan kaniadto nga command nga adunay kausaban. Ang tanan nga mga sugo sa ubos klaro nga gisusi sa bash Shell. Bisan kung wala nako gisusi apan ang usa ka mayor niini dili modagan sa ubang kabhang. Dinhi kita moadto sa katingalahan ug misteryosong paggamit sa ! simbolo o operator sa Linux commands.

Mahimong wala ka makaamgo sa kamatuoran nga mahimo nimong ipadagan ang usa ka sugo gikan sa imong sugo sa kasaysayan (naipatuman na/sa sayo pa nga mga sugo). Aron makasugod una pangitaa ang command number pinaagi sa pagpadagan sa 'history' nga sugo.

$ history

Karon pagdagan ang usa ka mando gikan sa kasaysayan pinaagi lang sa numero kung diin kini makita, sa output sa kasaysayan. Isulti ang pagpadagan sa usa ka sugo nga makita sa numero 1551 sa output sa 'history' nga sugo.

$ !1551

Ug, kini nagpadagan sa sugo (top command sa ibabaw nga kaso), nga gilista sa numero 1551. Kini nga paagi sa pagkuha sa na executed sugo makatabang kaayo ilabi na sa kaso sa mga sugo nga taas. Kinahanglan lang nimo kining tawgon gamit ang ![Numero diin kini makita sa output sa history command].

Mahimo nimong ipadagan ang mga sugo nga imong gipadagan kaniadto pinaagi sa ilang pagkasunod-sunod nga pagdagan nga ang katapusan nga run nga mando irepresentar nga -1, ikaduha nga katapusan ingon -2, ikapito nga katapusan ingon -7,….

Unang run history command para makakuha ug lista sa kataposang gipatuman nga command. Gikinahanglan ang pagpadagan sa history command, aron makasiguro ka nga walay command sama sa rm command > file ug uban pa aron lang masiguro nga dili ka makadagan sa bisan unsang delikado nga sugo nga aksidente. Ug dayon susiha ang Ika-unom nga kataposang sugo, Walo ka kataposang sugo ug Ikanapulo nga kataposang sugo.

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

Kinahanglan nako nga ilista ang sulud sa direktoryo '/home/$USER/Binary/firefox' mao nga gipabuto nako.

$ ls /home/$USER/Binary/firefox

Dayon akong naamgohan nga kinahanglan nakong ipabuto ang 'ls -l' aron makita kung unsang file ang ma-executable didto? Busa kinahanglan ba nakong i-type pag-usab ang tibuok nga sugo! Dili, dili ko kinahanglan. Kinahanglan lang nako nga dad-on ang katapusang argumento niining bag-ong sugo sama sa:

$ ls -l !$

Dinhi ang !$ magdala ug mga argumento nga gipasa sa kataposang sugo niining bag-ong sugo.

Ingnon ta nga naghimo ko og text file 1.txt sa Desktop.

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

ug dayon kopyaha kini sa '/home/avi/Downloads' gamit ang kompleto nga dalan sa matag kilid nga adunay cp command.

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

Karon nakapasar kami sa duha ka argumento nga adunay cp command. Una mao ang '/home/avi/Desktop/1.txt' ug ang ikaduha mao ang '/home/avi/Downloads', tugoti ang pagdumala niini sa lahi nga paagi, i-execute lang ang echo [argument] aron magkalainlain ang pag-imprinta sa duha ka argumento.

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

Matikdi ang unang argumento mahimong i-print isip \!^” ug ang uban nga argumento mahimong i-print pinaagi sa pag-execute \![Name_of_Command]:[Number_of_argument]”.

Sa pananglitan sa ibabaw ang una nga sugo mao ang 'cp' ug ang ika-2 nga argumento gikinahanglan aron maimprinta. Busa \!cp:2”, kon adunay command nga nag-ingon nga ang xyz gipadagan nga adunay 5 ka argumento ug kinahanglan nimo nga makakuha og ika-4 nga argumento, mahimo nimong gamiton ang \!xyz:4”, ug gamita kini sa gusto nimo. Ang tanang argumento mahimong ma-access pinaagi sa \!*”.

Mahimo natong ipatuman ang katapusang gipatuman nga sugo base sa mga keyword. Atong masabtan kini sama sa mosunod:

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

Dinhi gigamit namon ang parehas nga mando (ls) apan adunay lainlaing mga switch ug alang sa lainlaing mga folder. Dugang pa, nagpadala kami sa output sa matag command sa '/ dev/null' tungod kay dili kami mag-atubang sa output sa command ug ang console nagpabilin nga limpyo.

Karon Ipatuman ang katapusang run command base sa mga keyword.

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

Susiha ang output ug matingala ka nga nagpadagan ka na sa mga gipatuman nga mga sugo pinaagi lang sa ls nga mga keyword.

Mahimo nimong ipadagan/bag-ohon ang imong katapusang run command gamit ang (!!). Tawgon niini ang katapusang run command nga adunay alter/tweak sa kasamtangang command. Atong ipakita kanimo ang senaryo

Sa miaging adlaw nagpadagan ko og one-liner nga script aron makuha ang akong pribadong IP mao nga modagan ko,

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

Unya sa kalit akong nahibal-an nga kinahanglan nako nga i-redirect ang output sa script sa ibabaw sa usa ka file nga ip.txt, busa unsa ang akong buhaton? Kinahanglan ba nako nga i-type pag-usab ang tibuok nga sugo ug i-redirect ang output ngadto sa usa ka file? Usa ka sayon nga solusyon mao ang paggamit sa UP navigation key ug idugang ang > ip.txt aron i-redirect ang output ngadto sa file isip.

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

Salamat sa kinabuhi nga Manluluwas UP navigation key dinhi. Karon tagda ang ubos nga kondisyon, sa sunod higayon nga modagan ko ubos sa one-liner nga script.

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

Sa diha nga ako nagpadagan sa script, ang bash prompt mibalik og usa ka sayup nga adunay mensahe \bash: ifconfig: command not found, Dili lisud alang kanako ang pagtag-an nga akong gipadagan kini nga command isip user diin kini kinahanglan nga modagan ingon gamut.

Busa unsa ang solusyon? Lisud ang pag-login aron ma-root ug dayon i-type pag-usab ang tibuok nga sugo! Usab (UP Navigation Key) sa katapusan nga pananglitan wala moabut aron sa pagluwas dinhi. Busa? Kinahanglan natong tawagan ang \!!” nga walay mga kinutlo, nga motawag sa kataposang sugo para sa maong user.

$ su -c “!!” root

Dinhi ang su mao ang switch user nga maoy gamut, -c mao ang pagpadagan sa espesipikong command isip user ug ang pinaka importante nga bahin !! pulihan sa command ug last run command ilisan dinhi. Oo! Kinahanglan nimong ihatag ang root password.

Gigamit nako ang !! kasagaran sa mosunod nga mga senaryo,

1. Sa diha nga ako modagan apt-get command ingon nga normal nga user, ako sa kasagaran makakuha og usa ka sayop nga nag-ingon nga kamo walay pagtugot sa pagpatuman.

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

Opps error...ayaw kabalaka ipatuman ang ubos nga command para magmalampuson kini..

$ su -c !!

Sama sa akong gibuhat,

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

OOPS User dili awtorisado sa pagdala sa maong buluhaton, mao nga ako modagan ..

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

Ang ! (Logical NOT) mahimong gamiton sa pagpadagan sa command sa tanang file/extension gawas nga anaa sa luyo sa !.

A. Kuhaa ang tanan nga mga file gikan sa usa ka direktoryo gawas sa usa nga ang ngalan mao ang 2.txt.

$ rm !(2.txt)

B. Kuhaa ang tanang matang sa file gikan sa folder gawas sa usa nga ang extension kay 'pdf'.

$ $ rm !(*.pdf)

Dinhi atong gamiton ang ! -d aron ma-validate kung ang direktoryo anaa o wala gisundan sa Logical AND Operator (&&) aron i-print kana nga direktoryo wala maglungtad ug Logical OR Operator (||) aron i-print ang direktoryo anaa.

Ang lohika mao, kung ang output sa [ ! -d /home/avi/Tecmint ] is 0, it will execute what lies beyond Logical AND else it will go to Logical OR (||) and execute what lies beyond Logical OR.

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

Susama sa kondisyon sa ibabaw, apan dinhi kung ang gitinguha nga direktoryo wala maglungtad kini mogawas sa mando.

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

Usa ka kinatibuk-ang pagpatuman sa Scripting Language diin kung wala ang gusto nga direktoryo, maghimo kini usa.

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

Kana lang sa pagkakaron. Kung nahibal-an nimo o nakit-an nimo ang bisan unsang ubang gamit sa ! nga angay mahibal-an, mahimo nimong hatagan kami sa imong sugyot sa feedback. Padayon nga konektado!