ലിനക്സ് കമാൻഡുകളിലെ (!) ചിഹ്നത്തിന്റെയോ ഓപ്പറേറ്ററുടെയോ 10 അതിശയകരവും നിഗൂഢവുമായ ഉപയോഗങ്ങൾ


ലിനക്സിലെ ! ചിഹ്നം അല്ലെങ്കിൽ ഓപ്പറേറ്റർ ലോജിക്കൽ നെഗേഷൻ ഓപ്പറേറ്ററായും അതുപോലെ ചരിത്രത്തിൽ നിന്ന് കമാൻഡുകൾ ട്വീക്കുകളോടെ ലഭ്യമാക്കുന്നതിനോ അല്ലെങ്കിൽ മുമ്പ് റൺ ചെയ്ത കമാൻഡ് പരിഷ്ക്കരണത്തോടെ പ്രവർത്തിപ്പിക്കുന്നതിനോ ഉപയോഗിക്കാം. ചുവടെയുള്ള എല്ലാ കമാൻഡുകളും ബാഷ് ഷെല്ലിൽ വ്യക്തമായി പരിശോധിച്ചു. ഞാൻ പരിശോധിച്ചിട്ടില്ലെങ്കിലും ഇവയിൽ പ്രധാനം മറ്റ് ഷെല്ലിൽ പ്രവർത്തിക്കില്ല. ലിനക്സ് കമാൻഡുകളിലെ ! ചിഹ്നം അല്ലെങ്കിൽ ഓപ്പറേറ്റർ എന്നിവയുടെ അതിശയകരവും നിഗൂഢവുമായ ഉപയോഗങ്ങളിലേക്കാണ് നമ്മൾ ഇവിടെ പോകുന്നത്.

നിങ്ങളുടെ ഹിസ്റ്ററി കമാൻഡിൽ നിന്ന് (ഇതിനകം/നേരത്തെ എക്സിക്യൂട്ട് ചെയ്ത കമാൻഡുകൾ) നിങ്ങൾക്ക് ഒരു കമാൻഡ് പ്രവർത്തിപ്പിക്കാൻ കഴിയുമെന്ന വസ്തുത നിങ്ങൾക്ക് അറിയില്ലായിരിക്കാം. ആരംഭിക്കുന്നതിന് ആദ്യം 'history' കമാൻഡ് പ്രവർത്തിപ്പിച്ച് കമാൻഡ് നമ്പർ കണ്ടെത്തുക.

$ history

ചരിത്രത്തിന്റെ ഔട്ട്uപുട്ടിൽ, അത് ദൃശ്യമാകുന്ന നമ്പർ ഉപയോഗിച്ച് ചരിത്രത്തിൽ നിന്ന് ഒരു കമാൻഡ് പ്രവർത്തിപ്പിക്കുക. 'history' കമാൻഡിന്റെ ഔട്ട്uപുട്ടിൽ 1551 എന്ന നമ്പറിൽ ദൃശ്യമാകുന്ന ഒരു കമാൻഡ് പ്രവർത്തിപ്പിക്കുക.

$ !1551

കൂടാതെ, ഇത് 1551 എന്ന നമ്പറിൽ ലിസ്റ്റുചെയ്തിരിക്കുന്ന കമാൻഡ് (മുകളിലുള്ള കേസിലെ ടോപ്പ് കമാൻഡ്) പ്രവർത്തിപ്പിക്കുന്നു. ഇതിനകം എക്സിക്യൂട്ട് ചെയ്ത കമാൻഡ് വീണ്ടെടുക്കുന്നതിന് ഈ വഴി വളരെ സഹായകരമാണ്, പ്രത്യേകിച്ച് ആ കമാൻഡുകൾ ദൈർഘ്യമേറിയതാണെങ്കിൽ. ![ഇത് ഹിസ്റ്ററി കമാൻഡിന്റെ ഔട്ട്uപുട്ടിൽ ദൃശ്യമാകുന്ന നമ്പർ] ഉപയോഗിച്ച് നിങ്ങൾ അതിനെ വിളിക്കേണ്ടതുണ്ട്.

നിങ്ങൾ മുമ്പ് പ്രവർത്തിപ്പിച്ച ആ കമാൻഡുകൾ അവയുടെ റണ്ണിംഗ് സീക്വൻസ് ഉപയോഗിച്ച് പ്രവർത്തിപ്പിക്കാം, അവസാന റൺ കമാൻഡ് -1 ആയി പ്രതിനിധീകരിക്കും, രണ്ടാമത്തേത് -2 ആയി, ഏഴാമത്തേത് -7 ആയി,....

അവസാനം എക്സിക്യൂട്ട് ചെയ്ത കമാൻഡിന്റെ ഒരു ലിസ്റ്റ് ലഭിക്കാൻ ആദ്യം ഹിസ്റ്ററി കമാൻഡ് പ്രവർത്തിപ്പിക്കുക. ഹിസ്റ്ററി കമാൻഡ് പ്രവർത്തിപ്പിക്കേണ്ടത് ആവശ്യമാണ്, അതുവഴി rm കമാൻഡ് > ഫയൽ പോലെയുള്ള ഒരു കമാൻഡും ഇല്ലെന്ന് നിങ്ങൾക്ക് ഉറപ്പിക്കാം, അപകടകരമായ ഒരു കമാൻഡും നിങ്ങൾ ആകസ്മികമായി പ്രവർത്തിപ്പിക്കുന്നില്ലെന്ന് ഉറപ്പുവരുത്തുക. തുടർന്ന് ആറാമത്തെ അവസാന കമാൻഡ്, എട്ട് അവസാന കമാൻഡ്, പത്താമത്തെ അവസാന കമാൻഡ് എന്നിവ പരിശോധിക്കുക.

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

എനിക്ക് '/home/$USER/Binary/firefox' എന്ന ഡയറക്uടറിയുടെ ഉള്ളടക്കം ലിസ്റ്റുചെയ്യേണ്ടതുണ്ട്, അതിനാൽ ഞാൻ വെടിവച്ചു.

$ ls /home/$USER/Binary/firefox

അപ്പോൾ എനിക്ക് മനസ്സിലായി അവിടെ ഏത് ഫയലാണ് എക്uസിക്യൂട്ടബിൾ എന്ന് കാണാൻ ഞാൻ 'ls -l' ഫയർ ചെയ്യേണ്ടത്? അതിനാൽ ഞാൻ മുഴുവൻ കമാൻഡും വീണ്ടും ടൈപ്പ് ചെയ്യണം! ഇല്ല എനിക്ക് ആവശ്യമില്ല. ഈ പുതിയ കമാൻഡിലേക്ക് എനിക്ക് അവസാന വാദം കൊണ്ടുപോകേണ്ടതുണ്ട്:

$ ls -l !$

ഇവിടെ !$ അവസാന കമാൻഡിൽ പാസ്സാക്കിയ ആർഗ്യുമെന്റുകൾ ഈ പുതിയ കമാൻഡിലേക്ക് കൊണ്ടുപോകും.

ഡെസ്ക്ടോപ്പിൽ ഞാൻ ഒരു ടെക്സ്റ്റ് ഫയൽ 1.txt സൃഷ്ടിച്ചുവെന്ന് പറയാം.

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

തുടർന്ന് cp കമാൻഡ് ഉപയോഗിച്ച് ഇരുവശത്തുമുള്ള പൂർണ്ണമായ പാത ഉപയോഗിച്ച് '/home/avi/Downloads' എന്നതിലേക്ക് പകർത്തുക.

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

ഇപ്പോൾ നമ്മൾ cp കമാൻഡ് ഉപയോഗിച്ച് രണ്ട് ആർഗ്യുമെന്റുകൾ പാസാക്കി. ആദ്യത്തേത് '/home/avi/Desktop/1.txt' ആണ്, രണ്ടാമത്തേത് '/home/avi/Downloads' ആണ്, അവയെ വ്യത്യസ്തമായി കൈകാര്യം ചെയ്യാം, രണ്ട് ആർഗ്യുമെന്റുകളും വ്യത്യസ്തമായി പ്രിന്റ് ചെയ്യുന്നതിന് echo [arguments] എക്സിക്യൂട്ട് ചെയ്യുക.

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

നോട്ട് 1-ആം ആർഗ്യുമെന്റ് \!^” ആയി പ്രിന്റ് ചെയ്യാം, ബാക്കി ആർഗ്യുമെന്റുകൾ \![Name_of_Command]:[Number_of_argument]” എക്സിക്യൂട്ട് ചെയ്തുകൊണ്ട് പ്രിന്റ് ചെയ്യാം.

മുകളിലുള്ള ഉദാഹരണത്തിൽ ആദ്യത്തെ കമാൻഡ് 'cp' ആയിരുന്നു, പ്രിന്റ് ചെയ്യാൻ രണ്ടാമത്തെ ആർഗ്യുമെന്റ് ആവശ്യമാണ്. അതിനാൽ, \!cp:2”, xyz 5 ആർഗ്യുമെന്റുകൾ ഉപയോഗിച്ചാണ് പ്രവർത്തിക്കുന്നതെന്ന് ഏതെങ്കിലും കമാൻഡ് പറയുകയും നിങ്ങൾക്ക് നാലാമത്തെ ആർഗ്യുമെന്റ് ലഭിക്കുകയും ചെയ്യുകയാണെങ്കിൽ, നിങ്ങൾക്ക് \!xyz:4”, നിങ്ങൾക്ക് ഇഷ്ടമുള്ളതുപോലെ ഉപയോഗിക്കുക. എല്ലാ ആർഗ്യുമെന്റുകളും \!*” വഴി ആക്uസസ് ചെയ്യാൻ കഴിയും.

കീവേഡുകളുടെ അടിസ്ഥാനത്തിൽ നമുക്ക് അവസാനം എക്സിക്യൂട്ട് ചെയ്ത കമാൻഡ് എക്സിക്യൂട്ട് ചെയ്യാം. നമുക്ക് അത് ഇനിപ്പറയുന്ന രീതിയിൽ മനസ്സിലാക്കാം:

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

ഇവിടെ നമ്മൾ ഒരേ കമാൻഡ് (ls) ഉപയോഗിച്ചു, എന്നാൽ വ്യത്യസ്ത സ്വിച്ചുകൾക്കും വ്യത്യസ്ത ഫോൾഡറുകൾക്കുമായി. മാത്രമല്ല, ഓരോ കമാൻഡിന്റെയും ഔട്ട്uപുട്ടിലേക്ക് ഞങ്ങൾ '/dev/null' എന്നതിലേക്ക് അയച്ചു, കാരണം ഞങ്ങൾ കമാൻഡിന്റെ ഔട്ട്പുട്ടുമായി ഇടപെടാൻ പോകുന്നില്ല, കൺസോൾ വൃത്തിയായി തുടരുന്നു.

ഇപ്പോൾ കീവേഡുകളുടെ അടിസ്ഥാനത്തിൽ അവസാന റൺ കമാൻഡ് എക്സിക്യൂട്ട് ചെയ്യുക.

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

ഔട്ട്uപുട്ട് പരിശോധിക്കുക, ls കീവേഡുകൾ ഉപയോഗിച്ച് നിങ്ങൾ ഇതിനകം നടപ്പിലാക്കിയ കമാൻഡുകൾ പ്രവർത്തിപ്പിക്കുന്നത് നിങ്ങളെ ആശ്ചര്യപ്പെടുത്തും.

നിങ്ങൾക്ക് (!!) ഉപയോഗിച്ച് നിങ്ങളുടെ അവസാന റൺ കമാൻഡ് പ്രവർത്തിപ്പിക്കാനോ മാറ്റാനോ കഴിയും. നിലവിലെ കമാൻഡിൽ alter/tweak ഉപയോഗിച്ച് ഇത് അവസാന റൺ കമാൻഡിനെ വിളിക്കും. നിങ്ങൾക്ക് സാഹചര്യം കാണിക്കാം

കഴിഞ്ഞ ദിവസം എന്റെ സ്വകാര്യ ഐപി ലഭിക്കാൻ ഞാൻ ഒരു വൺ-ലൈനർ സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിച്ചു, അതിനാൽ ഞാൻ ഓടുന്നു,

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

മുകളിലുള്ള സ്uക്രിപ്റ്റിന്റെ ഔട്ട്uപുട്ട് ip.txt എന്ന ഫയലിലേക്ക് റീഡയറക്uട് ചെയ്യണമെന്ന് എനിക്ക് പെട്ടെന്ന് മനസ്സിലായി, അപ്പോൾ ഞാൻ എന്തുചെയ്യണം? ഞാൻ മുഴുവൻ കമാൻഡും വീണ്ടും ടൈപ്പ് ചെയ്uത് ഔട്ട്uപുട്ട് ഒരു ഫയലിലേക്ക് റീഡയറക്uട് ചെയ്യണോ? ഒരു ഫയലിലേക്ക് ഔട്ട്uപുട്ട് റീഡയറക്uട് ചെയ്യുന്നതിന് UP നാവിഗേഷൻ കീ ഉപയോഗിക്കുകയും > ip.txt ചേർക്കുകയും ചെയ്യുക എന്നതാണ് ഒരു എളുപ്പ പരിഹാരം.

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

ഇവിടെയുള്ള ജീവരക്ഷകൻ UP നാവിഗേഷൻ കീക്ക് നന്ദി. ഇപ്പോൾ താഴെയുള്ള അവസ്ഥ പരിഗണിക്കുക, അടുത്ത തവണ ഞാൻ വൺ-ലൈനർ സ്ക്രിപ്റ്റിന് താഴെ പ്രവർത്തിക്കുന്നു.

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

ഞാൻ സ്ക്രിപ്റ്റ് പ്രവർത്തിപ്പിച്ചയുടനെ, ബാഷ് പ്രോംപ്റ്റ്, \bash: ifconfig: command not found എന്ന സന്ദേശത്തിൽ ഒരു പിശക് നൽകി, ഈ കമാൻഡ് എവിടെയാണ് ഉപയോക്താവായി പ്രവർത്തിപ്പിക്കുന്നത് എന്ന് ഊഹിക്കാൻ എനിക്ക് പ്രയാസമില്ലായിരുന്നു. റൂട്ട് ആയി പ്രവർത്തിപ്പിക്കണം.

അപ്പോൾ എന്താണ് പരിഹാരം? റൂട്ടിലേക്ക് ലോഗിൻ ചെയ്uത് മുഴുവൻ കമാൻഡും വീണ്ടും ടൈപ്പുചെയ്യുന്നത് ബുദ്ധിമുട്ടാണ്! കൂടാതെ (യുപി നാവിഗേഷൻ കീ) അവസാനത്തെ ഉദാഹരണത്തിൽ ഇവിടെ രക്ഷപ്പെടുത്താൻ വന്നില്ല. അപ്പോൾ? ഉദ്ധരണികളില്ലാതെ നമുക്ക് \!!” എന്ന് വിളിക്കേണ്ടതുണ്ട്, അത് ആ ഉപയോക്താവിനുള്ള അവസാന കമാൻഡിനെ വിളിക്കും.

$ su -c “!!” root

ഇവിടെ su എന്നത് റൂട്ട് ആയ സ്വിച്ച് യൂസർ ആണ്, -c എന്നത് നിർദ്ദിഷ്ട കമാൻഡ് ഉപയോക്താവായി പ്രവർത്തിപ്പിക്കുക എന്നതാണ്, ഏറ്റവും പ്രധാനപ്പെട്ട ഭാഗം !! എന്നത് കമാൻഡ് ഉപയോഗിച്ച് മാറ്റി അവസാനമായി റൺ കമാൻഡ് നൽകും. ഇവിടെ മാറ്റിസ്ഥാപിക്കും. അതെ! നിങ്ങൾ റൂട്ട് പാസ്uവേഡ് നൽകേണ്ടതുണ്ട്.

ഞാൻ കൂടുതലും ഇനിപ്പറയുന്ന സാഹചര്യങ്ങളിൽ !! ഉപയോഗിക്കുന്നു,

1. ഞാൻ സാധാരണ ഉപയോക്താവായി apt-get കമാൻഡ് പ്രവർത്തിപ്പിക്കുമ്പോൾ, എക്സിക്യൂട്ട് ചെയ്യാൻ നിങ്ങൾക്ക് അനുമതിയില്ലെന്ന് പറയുന്ന ഒരു പിശക് എനിക്ക് സാധാരണയായി ലഭിക്കും.

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

ഓപ്uസ് പിശക്... വിഷമിക്കേണ്ട, അത് വിജയിക്കുന്നതിന് താഴെയുള്ള കമാൻഡ് എക്uസിക്യൂട്ട് ചെയ്യുക..

$ su -c !!

ഞാൻ ചെയ്യുന്ന അതേ രീതിയിൽ,

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

OOPS ഉപയോക്താവിന് അത്തരം ചുമതല വഹിക്കാൻ അധികാരമില്ല, അതിനാൽ ഞാൻ ഓടുന്നു..

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

! എന്നതിന് പിന്നിലുള്ള ഫയലുകൾ ഒഴികെ എല്ലാ ഫയലുകളിലും/വിപുലീകരണങ്ങളിലും കമാൻഡ് പ്രവർത്തിപ്പിക്കാൻ ! (ലോജിക്കൽ NOT) ഉപയോഗിക്കാം.

എ. 2.txt എന്ന പേരൊഴികെ എല്ലാ ഫയലുകളും ഒരു ഡയറക്ടറിയിൽ നിന്ന് നീക്കം ചെയ്യുക.

$ rm !(2.txt)

B. ഫോൾഡറിൽ നിന്ന് 'pdf' എന്ന വിപുലീകരണം ഒഴികെയുള്ള എല്ലാ ഫയൽ തരങ്ങളും നീക്കം ചെയ്യുക.

$ $ rm !(*.pdf)

ഇവിടെ നമ്മൾ ഉപയോഗിക്കും! -d ഡയറക്uടറി നിലവിലില്ലെങ്കിലോ ലോജിക്കൽ ആന്റ് ഓപ്പറേറ്റർ (&&) ആ ഡയറക്uടറി നിലവിലില്ലെങ്കിലും ലോജിക്കൽ അല്ലെങ്കിൽ ഓപ്പറേറ്റർ (||) അച്ചടിക്കാൻ ഡയറക്ടറി നിലവിലുണ്ട്.

[ ന്റെ ഔട്ട്പുട്ട് എപ്പോൾ എന്നതാണ് യുക്തി. -d /home/avi/Tecmint ] എന്നത് 0 ആണ്, അത് ലോജിക്കലിനപ്പുറം ഉള്ളത് എക്സിക്യൂട്ട് ചെയ്യും, അല്ലെങ്കിൽ അത് ലോജിക്കൽ അല്ലെങ്കിൽ (||) എന്നതിലേക്ക് പോയി ലോജിക്കൽ OR എന്നതിന് അപ്പുറത്തുള്ളത് എക്സിക്യൂട്ട് ചെയ്യും.

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

മുകളിലുള്ള അവസ്ഥയ്ക്ക് സമാനമാണ്, എന്നാൽ ഇവിടെ ആവശ്യമുള്ള ഡയറക്ടറി നിലവിലില്ലെങ്കിൽ അത് കമാൻഡിൽ നിന്ന് പുറത്തുകടക്കും.

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

ആവശ്യമുള്ള ഡയറക്uടറി നിലവിലില്ലെങ്കിൽ, സ്uക്രിപ്റ്റിംഗ് ഭാഷയിൽ ഒരു പൊതു നിർവ്വഹണം, അത് സൃഷ്uടിക്കും.

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

ഇപ്പോഴത്തേക്ക് ഇത്രമാത്രം. ! എന്നതിന്റെ മറ്റെന്തെങ്കിലും ഉപയോഗം നിങ്ങൾ അറിയുകയോ കാണുകയോ ചെയ്uതാൽ, ഫീഡ്uബാക്കിൽ നിങ്ങളുടെ നിർദ്ദേശം ഞങ്ങൾക്ക് നൽകാൻ നിങ്ങൾ ആഗ്രഹിച്ചേക്കാം. ബന്ധം നിലനിർത്തുക!