PATH variable & export


ZawGyi Code

PATH variable
Linux shell scripting ေတြအတြက္မွာ shell environment variables ေတြကို Dataေတြ valueေတြ 
သိမ္းဆည္းဖုိ ့ software configurations ေတြ သိမ္းဆည္ဖုိ ့Terminal အတြက္ settingေတြ သက္မွတ္ဖုိ ့
shell environment ေတြကို ေျပာင္းလဲဖုိ ့အတြက္ စသည္ျဖင့္ သံုးက်ပါတယ္။ shell environment variable ေ
တြကို ႀကည့္မယ္ဆို terminal မွာ printenv လို့ရိုက္လိုက္ရင္ global အျဖစ္ရွိေနတဲ့ variable ေတြကို ျမင္ရမွာပါ။ 
ခု ေအာက္က ျပထားတဲ့ ပံုကေတာ့ printenv လုိ့ရိုက္လိုက္ရင္ ထြက္မယ့္ resultေတြ႔ပဲျဖစ္ပါတယ္။ အကုန္ဆုိ 
screen မဆန့္ပါဘူး။ အဲ့ေတာ့ printenv | less လုိ့ ရိုက္ႀကည့္မယ္ဆုိ enter နွိပ္ျပီး စာေႀကာင္းေတြကို 
တစ္ေႀကာင္းျပီး တစ္ေႀကာင္း ႀကည့္သြားယံုပါပဲ။
အဲ့လုိ မ်ားစြာရွိေနတဲ့ variableေတြထဲကမွ PATH ဆုိတဲ့ variable အေႀကာင္းကို ေျပာျပခ်င္ပါတယ္။ 
PATH variable အေႀကာင္းကို ေျပာျပမွာျဖစ္ပါတယ္။ PATH ရဲ့ အဓိကတာ၀န္က ဘာလဲဆုိေတာ့ executable 
filesေတြ တည္ရွိတဲ့ ေနရာကို ညြန္ျပေပးမယ့္ လမ္းေႀကာင္း(path)ေတြကို သိမ္းဆည္းထားတဲ့ environmental 
variable တစ္ခုပဲ ျဖစ္ပါတယ္။ ဘယ္လိုမ်ိဳလဲ ဆိုတာကို ဥပမာေလးေတြနဲ့ တစ္ခ်က္ႀကည့္လိုက္က်ရေအာင္ဗ်ာ ့။ 
ပထမဆံုး myscriptဆိုတဲ့ directoryေလး ေဆာက္လိုက္မယ္ဗ်ာ ့/home/spacex/myscript ေပါ့။ ျပီးေတာ့ 
myscript ေအာက္မွာ commandေလး တစ္ေႀကာင္းေလာက္နဲ ့executable ဖိုင္းေလး တစ္ဖိုင္ vim နဲ ့create 
လုပ္လိုက္မယ္ဗ်ာ ့။
အဲ့ေနာက္မွာေတာ့ runဖုိ ့ executeလုပ္ဖုိ ့ permission ကို chmod 777 ဆုိျပီး ခ်ိန္းေပးလိုက္ပါတယ္။ 
အဲ့ေနာက္မွာေတာ့ ./SayHello( လက္ရွိ ရွိေနတဲ့ directory ေအာက္မွာ ရွိေနလို့) ဒါမွမဟုတ္ absolute path 
အစအဆံုး ရိုက္ျပီး /home/spacex/myscript/SayHello လို့ run လိုက္ရင္ Hello, nice to see you. 
I am Spacex. ဆိုတဲ့ စာသားေလး ေပၚလာပါလိမ့္မယ္။

အဲ့လိုမဟုတ္ပဲ ကိုယ္ဘယ္ေနရာ ေရာက္ေရာက္ SayHello လုိ ့run လုိက္တာနဲ ့ ရေစခ်င္တယ္ဆိုရင္ 
အဲ့ဖိုင္ရွိေနတဲ့ Pathလမ္းေႀကာင္း(/home/spacex/myscript/)ကို PATH ဆိုတဲ့ variable ထဲထား ထည့္ထားဖုိ့
လိုပါတယ္။ PATH သည္ veriable ျဖစ္တဲ့ အတြက္ ျပင္ဆင္(edit) လို့ ရပါတယ္။ termainal မွာ  
PATH=$PATH:/home/spacex/myscript ဆုိျပီး ရိုက္ေပးလုိက္ရင္ ကုိယ္ေတြ ထည့္ခ်င္တဲ့ လမ္းေႀကာင္း
တစ္ခုျဖစ္တဲ ့/home/spcaex/myscritp ကို ေနာက္ဆံုးမွာ ေပါင္းထည့္ေပးလိုက္တာပါ။ အဲ့တာမွ terminal
 မွာ SayHello လို ့ရုိက္ျပီး runလိုက္ရင္ internal command မဟုတ္ဘူးတဲ့အတြက္ PATHထဲမွာ ရွိေနတဲ့ location
 ေတြမွာ ရွာေတြ့ရင္ run ပါတယ္။ မရွိခဲ့ရင္ SayHello: command not found ဆုိျပီး error တက္ပါလိမ့္မယ္။
 

PATH variable ထဲမွာ လမ္းေႀကာင္းအသစ္ ထပ္ထည့္ပံု အလုပ္လုပ္ပံုကို မ်က္စိထဲမွာ ပိုျမင္သာေအာင္
 ေျပာျပခ်င္ေသးတယ္ဗ်ာ ့။ echo $PATH လို့ run လိုက္ရင္ PATH ထဲမွာ ရွိေနတဲ့ variable ေတြ 
ထြက္လာတယ္ေလ။ အဲ့လိုပဲ $PATH(/usr/local:/usr/bin:......) ေနာက္ေနျပီး ကိုယ္ထည့္ခ်င္တဲ့ 
လမ္းေျကာင္းေလးကို :(full-column) ေလးနဲ့ ေပါင္းထည့္ေပးလိုက္တာပါ။ အဲ့ေပါင္းထည္ထားတဲ့ 
varaible အစုကို PATHထဲကို ျပန္ထည့္ေပးလိုက္တာပါ။ အကယ္လို ့ ေပါင္းထည့္ခ်င္တဲ့ လမ္းေႀကာင္းက 
တစ္ခုမကရွိေနရင္ : (full-column) ေလးေတြခံျပီး ေရးေပးယံုပါပဲ။ ကိုယ္က ကိုယ့္ pathလမ္းေႀကာင္းကို 
အေနာက္မဟုတ္ပဲ အေရွ ့ကေနေပါင္းထည့္ခ်င္တယ္ ဆုိရင္လဲ $PATH ရဲ ့အေရွ့ မွာ ေရးေပးလိုက္ယံုပါပဲ။

တစ္ကယ္လိုမ်ား PATH= /home/spacex/myscript/ လို ့မ်ား ေရးခဲ့မိလိုက္မယ္ဆုိရင္ PATHထဲမွာ 
/home/spacex/myscript/ ဆုိတဲ့ လမ္းေႀကာင္းတစ္ခုပဲ ရွိေတာ့မွာပါ။ အကုန္ overwrite ျဖစ္သြားပါလိမ့္မယ္။ 
[photo]

List of Priority order

က်ြန္ေတာ္တုိ့ေတြ terminal မွာ command တစ္ခု ရိုက္လိုက္ျပီးဆိုရင္ နာမည္(Key Word) တူတာေတြ ရွိေနမယ္
ဆုိရင္ ဘယ္ကေကာင္ကို အရင္ဦးစားေပး run(execute) လုပ္ရမယ္ဆုိတဲ ့ Priority Order ရွိတယ္ဗ်ာ ့။ 
သူတုိ့ေတြကေတာ့..
  1. Bash alias
  2. Special builtins (only in POSIX mode)
  3. Functions
  4. Builtins (Internal command)
  5. A search in $PATH (External command)
    1. First location in $PATH
    2. Second location in $PATH
    3. And so on…….

ခု focus လုပ္ျပီး မ်က္စိထဲျမင္ႀကည့္ရမွာက no.4 နဲ ့ no.5 ပါ။ တစ္ျခားအေပၚကေကာင္ကို ခနေမ့ထားလို့ ရပါတယ္။
 သူတို့ေတြကို သက္ဆုိင္င္ရာ ေနာင္အခန္းေတြက်မွ ရွင္းျပပါ့မယ္ဗ်ာ ့။ terminal ကေန command တစ္ခု run လိုက္ရင္
 internal builtin မွာ ရွိေနတယ္ဆုိ internal builtin command အေနနဲ ့ execute လုပ္ပါတယ္။ Internal Builtin 
မဟုတ္တဲ့ command ေတြက် external အျဖစ္နဲ ့ $PATH မွာသြားႀကည့္ပါတယ္။ ႀကည့္တဲ့ေနရာမွာလဲ terminal 
အစ ဘယ္ဘက္(left side) ကေနျပီး path တစ္ခုခ်င္းဆီကို မေတြ့မခ်င္း  ႀကည့္သြားပါတယ္။ အကယ္လို့ သံုးခုေျမာက္ 
pathလမ္းေႀကာင္း မွာ ေတြ့တယ္ဆို အဲ့ေနရာမွာ ရွာတဲ့ အလုပ္ကို ရပ္ျပီး runပါတယ္။ ေနာက္ကေကာင္ေတြကို
 ဆက္မႀကည့္ေတာ့ပါဘူး။

ေနာက္ျပီး variableေတြ PATHေတြနဲ့ တြဲသိဖုို့လိုတဲ့ ေကာင္ကေတာ့ export ပါ။
Export ဆိုတာက linux မွာ build-in  ပါေနတဲ့ commandပါ။ ေျပာရရင္ေတာ့ linux shell ရဲ့ အစိတ္အပိုင္းတစ္ခုလိုပါပဲ။
 ေအာက္မွာ သူ ့ရဲ့ syntex ပါ။
Example ေလးေတြနဲ ့တစ္ခ်က္ျကည့္ က်ရေအာင္ဗ်ာ။
(1)  a=linux ဆုိျပီး linux ဆုိတဲ့ စာသားကို a ဆုိတဲ့ variable ကို ထည့္လိုက္ပါတယ္။
(2)  echo command နဲ့ a variable ထဲမွာ ရွိတဲ့ data(value) ကို ထုတ္ဖုိ့အတြက္ echo $a ဆုိျပီး သံုးပါတယ္။ 
a  ေရွ့မွာ $ ထည့္ရတာကေတာ့ a ကို variable အေနနဲ့ သိေအာင္လို့ပါ။
(3) bash ဆုိျပီး child process အသစ္ဖန္တီးလိုက္ပါ။။ အဲ့ေနာက္မွာ a variable ကို ျပန္ျပီး ထုတ္ျကည့္ပါ။
(4)echo $a ဆုိျပီး ထုတ္ျကည့္လိုက္ပါ။ new child process မွာက် a က ဘာ data/value မွ သူ့ထဲကို define 
မလုပ္ထားတဲ့အတြက္ ထြက္လာမွာ မဟုတ္ပါဘူး။

(a)a=linux >> a  ထဲကို linux ဆုိတဲ့ word ေလးကို ထည့္လိုက္္ပါတယ္။ အဲ့ေနာက္ export a ဆိုျပီး export လုပ္ပါတယ္။
  child process ေတြမွာပါ သံုးနုိင္ေအာင္လို့ပါ။
(b)အဲ့ေနာက္ bash ဆုိျပီး child process အသစ္ကို  create လုပ္လိုက္ပါ။ new child process အေနနဲ့ 
a ထဲက data ကို ထုတ္ျကည့္ပါ။ echo $a >> linux ဆုိျပီး ထြက္လာပါလိမ့္မယ္။

ဒါေပမယ့္ terminal ပိတ္ျပီး ျပန္ဖြင့္တဲ့ အခါ tty session တစ္ခု အသစ္က ျပန္စတဲ့ အခါက်ရင္ေတာ့ export 
လုပ္ထားလည္း ရွိေတာ့မွာ မဟုတ္ပါဘူး.. Perminent လုပ္ခ်င္တယ္ဆုိရင္ေတာ့

~/.bash_profile
~/.bash_profile
~/.bashrc

တုိ့ရဲ့ ေအာက္ဆံုးလိုင္းမွာ သြားထည့္ေပးလိုက္ယံုပါပဲ။
PATH=$PATH:/home/spacex/myscript
export a=linux

UniCode





PATH variable




Linux shell scripting တွေအတွက်မှာ shell environment variables တွေကို Dataတွေ valueတွေ သိမ်းဆည်းဖို ့ software configurations တွေ သိမ်းဆည်ဖို ့Terminal အတွက် settingတွေ သက်မှတ်ဖို ့shell environment တွေကို ပြောင်းလဲဖို ့အတွက် စသည်ဖြင့် သုံးကျပါတယ်။ shell environment variable တွေကို ကြည့်မယ်ဆို terminal မှာ printenv လို့ရိုက်လိုက်ရင် global အဖြစ်ရှိနေတဲ့ variable တွေကို မြင်ရမှာပါ။ ခု အောက်က ပြထားတဲ့ ပုံကတော့ printenv လို့ရိုက်လိုက်ရင် ထွက်မယ့် resultတွေ့ပဲဖြစ်ပါတယ်။ အကုန်ဆို screen မဆန့်ပါဘူး။ အဲ့တော့ printenv | less လို့ ရိုက်ကြည့်မယ်ဆို enter နှိပ်ပြီး စာကြောင်းတွေကို တစ်ကြောင်းပြီး တစ်ကြောင်း ကြည့်သွားယုံပါပဲ။


အဲ့လို များစွာရှိနေတဲ့ variableတွေထဲကမှ PATH ဆိုတဲ့ variable အကြောင်းကို ပြောပြချင်ပါတယ်။ PATH variable အကြောင်းကို ပြောပြမှာဖြစ်ပါတယ်။ PATH ရဲ့ အဓိကတာဝန်က ဘာလဲဆိုတော့ executable filesတွေ တည်ရှိတဲ့ နေရာကို ညွန်ပြပေးမယ့် လမ်းကြောင်း(path)တွေကို သိမ်းဆည်းထားတဲ့ environmental variable တစ်ခုပဲ ဖြစ်ပါတယ်။ ဘယ်လိုမျိုလဲ ဆိုတာကို ဥပမာလေးတွေနဲ့ တစ်ချက်ကြည့်လိုက်ကျရအောင်ဗျာ ့။ ပထမဆုံး myscriptဆိုတဲ့ directoryလေး ဆောက်လိုက်မယ်ဗျာ ့/home/spacex/myscript ပေါ့။ ပြီးတော့ myscript အောက်မှာ commandလေး တစ်ကြောင်းလောက်နဲ ့executable ဖိုင်းလေး တစ်ဖိုင် vim နဲ ့create လုပ်လိုက်မယ်ဗျာ ့။


အဲ့နောက်မှာတော့ runဖို ့ executeလုပ်ဖို ့ permission ကို chmod 777 ဆိုပြီး ချိန်းပေးလိုက်ပါတယ်။ အဲ့နောက်မှာတော့ ./SayHello( လက်ရှိ ရှိနေတဲ့ directory အောက်မှာ ရှိနေလို့) ဒါမှမဟုတ် absolute path အစအဆုံး ရိုက်ပြီး /home/spacex/myscript/SayHello လို့ run လိုက်ရင် Hello, nice to see you. I am Spacex. ဆိုတဲ့ စာသားလေး ပေါ်လာပါလိမ့်မယ်။



အဲ့လိုမဟုတ်ပဲ ကိုယ်ဘယ်နေရာ ရောက်ရောက် SayHello လို ့run လိုက်တာနဲ ့ ရစေချင်တယ်ဆိုရင် အဲ့ဖိုင်ရှိနေတဲ့ Pathလမ်းကြောင်း(/home/spacex/myscript/)ကို PATH ဆိုတဲ့ variable ထဲထား ထည့်ထားဖို့လိုပါတယ်။ PATH သည် veriable ဖြစ်တဲ့ အတွက် ပြင်ဆင်(edit) လို့ ရပါတယ်။ termainal မှာ PATH=$PATH:/home/spacex/myscript ဆိုပြီး ရိုက်ပေးလိုက်ရင် ကိုယ်တွေ ထည့်ချင်တဲ့ လမ်းကြောင်းတစ်ခုဖြစ်တဲ ့/home/spcaex/myscritp ကို နောက်ဆုံးမှာ ပေါင်းထည့်ပေးလိုက်တာပါ။ အဲ့တာမှ terminal မှာ SayHello လို ့ရိုက်ပြီး runလိုက်ရင် internal command မဟုတ်ဘူးတဲ့အတွက် PATHထဲမှာ ရှိနေတဲ့ location တွေမှာ ရှာတွေ့ရင် run ပါတယ်။ မရှိခဲ့ရင် SayHello: command not found ဆိုပြီး error တက်ပါလိမ့်မယ်။





PATH variable ထဲမှာ လမ်းကြောင်းအသစ် ထပ်ထည့်ပုံ အလုပ်လုပ်ပုံကို မျက်စိထဲမှာ ပိုမြင်သာအောင် ပြောပြချင်သေးတယ်ဗျာ ့။ echo $PATH လို့ run လိုက်ရင် PATH ထဲမှာ ရှိနေတဲ့ variable တွေ ထွက်လာတယ်လေ။ အဲ့လိုပဲ $PATH(/usr/local:/usr/bin:......) နောက်နေပြီး ကိုယ်ထည့်ချင်တဲ့ လမ်းကြောင်းလေးကို :(full-column) လေးနဲ့ ပေါင်းထည့်ပေးလိုက်တာပါ။ အဲ့ပေါင်းထည်ထားတဲ့ varaible အစုကို PATHထဲကို ပြန်ထည့်ပေးလိုက်တာပါ။ အကယ်လို ့ ပေါင်းထည့်ချင်တဲ့ လမ်းကြောင်းက တစ်ခုမကရှိနေရင် : (full-column) လေးတွေခံပြီး ရေးပေးယုံပါပဲ။ ကိုယ်က ကိုယ့် pathလမ်းကြောင်းကို အနောက်မဟုတ်ပဲ အရှေ ့ကနေပေါင်းထည့်ချင်တယ် ဆိုရင်လဲ $PATH ရဲ ့အရှေ့ မှာ ရေးပေးလိုက်ယုံပါပဲ။


တစ်ကယ်လိုများ PATH= /home/spacex/myscript/ လို ့များ ရေးခဲ့မိလိုက်မယ်ဆိုရင် PATHထဲမှာ /home/spacex/myscript/ ဆိုတဲ့ လမ်းကြောင်းတစ်ခုပဲ ရှိတော့မှာပါ။ အကုန် overwrite ဖြစ်သွားပါလိမ့်မယ်။ [photo]


List of Priority order


ကျွန်တော်တို့တွေ terminal မှာ command တစ်ခု ရိုက်လိုက်ပြီးဆိုရင် နာမည်(Key Word) တူတာတွေ ရှိနေမယ်ဆိုရင် ဘယ်ကကောင်ကို အရင်ဦးစားပေး run(execute) လုပ်ရမယ်ဆိုတဲ ့ Priority Order ရှိတယ်ဗျာ ့။ သူတို့တွေကတော့..


Bash alias


Special builtins (only in POSIX mode)


Functions


Builtins (Internal command)


A search in $PATH (External command)


First location in $PATH


Second location in $PATH


And so on…….



ခု focus လုပ်ပြီး မျက်စိထဲမြင်ကြည့်ရမှာက no.4 နဲ ့ no.5 ပါ။ တစ်ခြားအပေါ်ကကောင်ကို ခနမေ့ထားလို့ ရပါတယ်။ သူတို့တွေကို သက်ဆိုင်င်ရာ နောင်အခန်းတွေကျမှ ရှင်းပြပါ့မယ်ဗျာ ့။ terminal ကနေ command တစ်ခု run လိုက်ရင် internal builtin မှာ ရှိနေတယ်ဆို internal builtin command အနေနဲ ့ execute လုပ်ပါတယ်။ Internal Builtin မဟုတ်တဲ့ command တွေကျ external အဖြစ်နဲ ့ $PATH မှာသွားကြည့်ပါတယ်။ ကြည့်တဲ့နေရာမှာလဲ terminal အစ ဘယ်ဘက်(left side) ကနေပြီး path တစ်ခုချင်းဆီကို မတွေ့မချင်း ကြည့်သွားပါတယ်။ အကယ်လို့ သုံးခုမြောက် pathလမ်းကြောင်း မှာ တွေ့တယ်ဆို အဲ့နေရာမှာ ရှာတဲ့ အလုပ်ကို ရပ်ပြီး runပါတယ်။ နောက်ကကောင်တွေကို ဆက်မကြည့်တော့ပါဘူး။


နောက်ပြီး variableတွေ PATHတွေနဲ့ တွဲသိဖိုု့လိုတဲ့ ကောင်ကတော့ export ပါ။


Export ဆိုတာက linux မှာ build-in ပါနေတဲ့ commandပါ။ ပြောရရင်တော့ linux shell ရဲ့ အစိတ်အပိုင်းတစ်ခုလိုပါပဲ။ အောက်မှာ သူ ့ရဲ့ syntex ပါ။


Example လေးတွေနဲ ့တစ်ချက်ကြည့် ကျရအောင်ဗျာ။


(1) a=linux ဆိုပြီး linux ဆိုတဲ့ စာသားကို a ဆိုတဲ့ variable ကို ထည့်လိုက်ပါတယ်။


(2) echo command နဲ့ a variable ထဲမှာ ရှိတဲ့ data(value) ကို ထုတ်ဖို့အတွက် echo $a ဆိုပြီး သုံးပါတယ်။ a ရှေ့မှာ $ ထည့်ရတာကတော့ a ကို variable အနေနဲ့ သိအောင်လို့ပါ။


(3) bash ဆိုပြီး child process အသစ်ဖန်တီးလိုက်ပါ။။ အဲ့နောက်မှာ a variable ကို ပြန်ပြီး ထုတ်ကြည့်ပါ။


(4)echo $a ဆိုပြီး ထုတ်ကြည့်လိုက်ပါ။ new child process မှာကျ a က ဘာ data/value မှ သူ့ထဲကို define မလုပ်ထားတဲ့အတွက် ထွက်လာမှာ မဟုတ်ပါဘူး။


(a)a=linux >> a ထဲကို linux ဆိုတဲ့ word လေးကို ထည့်လိုက််ပါတယ်။ အဲ့နောက် export a ဆိုပြီး export လုပ်ပါတယ်။ child process တွေမှာပါ သုံးနိုင်အောင်လို့ပါ။


(b)အဲ့နောက် bash ဆိုပြီး child process အသစ်ကို create လုပ်လိုက်ပါ။ new child process အနေနဲ့ a ထဲက data ကို ထုတ်ကြည့်ပါ။ echo $a >> linux ဆိုပြီး ထွက်လာပါလိမ့်မယ်။


ဒါပေမယ့် terminal ပိတ်ပြီး ပြန်ဖွင့်တဲ့ အခါ tty session တစ်ခု အသစ်က ပြန်စတဲ့ အခါကျရင်တော့ export လုပ်ထားလည်း ရှိတော့မှာ မဟုတ်ပါဘူး.. Perminent လုပ်ချင်တယ်ဆိုရင်တော့


~/.bash_profile


~/.bash_profile


~/.bashrc


တို့ရဲ့ အောက်ဆုံးလိုင်းမှာ သွားထည့်ပေးလိုက်ယုံပါပဲ။


PATH=$PATH:/home/spacex/myscript


export a=linux


Comments