သင်တန်းမိတ်ဆက် + Shell အသုံးပြုနည်းမိတ်ဆက်

ကျွန်ုပ်တို့သည် မည်သူများနည်း။

ဤသင်တန်းကို Anish၊ Jon နှင့် Jose တို့မှ ပူးတွဲသင်ကြားပေးထားခြင်းဖြစ်သည်။ ကျွန်ုပ်တို့အားလုံးသည် MIT ကျောင်းသားဟောင်းများဖြစ်ကြပြီး ကျောင်းသားဘဝတုန်းက ဤ MIT IAP သင်တန်းကို စတင်ခဲ့ကြခြင်းဖြစ်သည်။ ကျွန်ုပ်တို့ထံ ဆက်သွယ်လိုပါက missing-semester@mit.edu သို့ အီးမေးလ်ပေးပို့နိုင်ပါသည်။

ကျွန်ုပ်တို့သည် ဤသင်တန်းကို သင်ကြားရန်အတွက် ဉာဏ်ပူဇော်ခ ရယူခြင်းမရှိသလို၊ မည်သည့်နည်းလမ်းဖြင့်မျှ စီးပွားဖြစ် ပြုလုပ်ထားခြင်းမရှိပါ။ ကျွန်ုပ်တို့၏ သင်တန်းစာသင်ပစ္စည်းများ နှင့် သင်ခန်းစာ ဗီဒီယိုမှတ်တမ်းများ အားလုံးကို အွန်လိုင်းတွင် အခမဲ့ လွတ်လပ်စွာ ကြည့်ရှုနိုင်ရန် စီစဉ်ပေးထားပါသည်။ သင်၏ပံ့ပိုးကူညီမှုကို ပြသလိုပါက အကောင်းဆုံးနည်းလမ်းမှာ ဤသင်တန်းအကြောင်းကို အခြားသူများထံ သတင်းမျှဝေပေးခြင်းပင် ဖြစ်ပါသည်။ အကယ်၍ သင်သည် ကုမ္ပဏီ၊ တက္ကသိုလ် သို့မဟုတ် အခြားအဖွဲ့အစည်းတစ်ခုဖြစ်ပြီး ဤသင်ရိုးညွှန်းတမ်းကို သင်တန်းသား အများအပြားအား သင်ကြားပို့ချပေးနေပါက ကျွန်ုပ်တို့သိရှိနိုင်ရန်အတွက် အတွေ့အကြုံ အစီရင်ခံစာများ/သုံးသပ်ချက်များကို အီးမေးလ်မှတစ်ဆင့် ပေးပို့ပေးပါရန် မေတ္တာရပ်ခံအပ်ပါသည်။ :)

သင်တန်းဖွင့်လှစ်ရခြင်း ရည်ရွယ်ချက်

ကွန်ပျူတာသိပ္ပံပညာရှင်များအနေဖြင့် ကွန်ပျူတာများသည် ထပ်ခါတလဲလဲ ပြုလုပ်ရသော အလုပ်များကို ကူညီဆောင်ရွက်ပေးရာတွင် အလွန်ကောင်းမွန်ကြောင်း ကျွန်ုပ်တို့ သိရှိကြသည်။ သို့သော်လည်း ဤအချက်သည် ကျွန်ုပ်တို့၏ ပရိုဂရမ်များ လုပ်ဆောင်စေလိုသည့် တွက်ချက်မှုများတွင်သာမက ကျွန်ုပ်တို့ကိုယ်တိုင် ကွန်ပျူတာကို အသုံးပြုပုံ တွင်လည်း အလားတူ သက်ရောက်ကြောင်း မကြာခဏဆိုသလို မေ့လျော့နေတတ်ကြသည်။ ကွန်ပျူတာနှင့် ပတ်သက်သည့် မည်သည့်ပြဿနာမဆို ဖြေရှင်းသည့်အခါ လုပ်ငန်းတွင်ကျယ်မှု ပိုမိုရှိစေရန်နှင့် ပိုမိုရှုပ်ထွေးသော ပြဿနာများကို ဖြေရှင်းနိုင်စေရန်အတွက် ကျယ်ပြန့်လှသော tools များကို လက်တစ်ကမ်းတွင် အသင့်ရရှိနိုင်ပါသည်။ သို့သော် ကျွန်ုပ်တို့အနက် အများအပြားသည် ထို tools များ၏ သေးငယ်သော အစိတ်အပိုင်းမျှကိုသာ အသုံးပြုကြပြီး အဆင်ပြေရုံမျှ အလွတ်ကျက်မှတ်ထားသော ကွန်ပျူတာ command အနည်းငယ်ကိုသာ သိရှိကြကာ အခက်အခဲတွေ့သည့်အခါ အင်တာနက်မှ command များကို မစဉ်းစားမဆင်ခြင်ဘဲ ကူးယူဖော်ပြ (copy-paste) တတ်ကြသည်။

ဤသင်တန်းသည် ထိုပြဿနာကို ဖြေရှင်းရန် ကြိုးပမ်းမှုတစ်ခု ဖြစ်ပါသည်။

ကျွန်ုပ်တို့သည် သင်သိရှိပြီးသား tools များကို အထိရောက်ဆုံး အသုံးပြုနည်းကို သင်ကြားပေးလိုပြီး၊ သင်၏ toolbox ထဲသို့ ထည့်သွင်းရန် tools အသစ်များကို ပြသပေးကာ၊ မိမိကိုယ်တိုင် tools အသစ်များကို ပိုမိုရှာဖွေ လေ့လာရန် (အချို့ကို ဖန်တီးရန်လည်း ဖြစ်နိုင်သည်) စိတ်အားထက်သန်မှု မြှင့်တင်ပေးနိုင်ရန် မျှော်လင့်ပါသည်။ ဤသည်မှာ ကွန်ပျူတာသိပ္ပံ သင်ရိုးညွှန်းတမ်း အများစုတွင် လိုအပ်နေသော ပျောက်ဆုံးနေသည့် စာသင်နှစ်ဝက် (The Missing Semester) ဖြစ်သည်ဟု ကျွန်ုပ်တို့ ယုံကြည်ပါသည်။

သင်တန်းစနစ်နှင့် ဖွဲ့စည်းပုံ

အမှတ်မပေးသော (not-for-credit) ဤသင်တန်းတွင် ၁ နာရီကြာ သင်ခန်းစာ ၉ ခု ပါဝင်ပြီး၊ တစ်ခုစီသည် သီးခြားခေါင်းစဉ်တစ်ခု ကို အဓိကထားထားသည်။ သင်ခန်းစာများသည် သီးခြားစီ လေ့လာနိုင်သော ခေါင်းစဉ်များ ဖြစ်ကြသော်လည်း သင်တန်းကာလ ကြာမြင့်လာသည်နှင့်အမျှ ယခင်သင်ခန်းစာများမှ အကြောင်းအရာများကို သင်ကျွမ်းကျင်ပြီးသားဖြစ်သည်ဟု ကျွန်ုပ်တို့ ယူဆသွားမည်ဖြစ်သည်။ ကျွန်ုပ်တို့သည် စာတွေ့မှတ်စုများကို အွန်လိုင်းတွင် တင်ပေးထားသော်လည်း စာသင်ချိန်အတွင်း သင်ကြားပြသသည့် အကြောင်းအရာများ (ဥပမာ- လက်တွေ့ပြသမှု demos များ) သည် စာတွေ့မှတ်စုများတွင် ပါဝင်ချင်မှ ပါဝင်မည်ဖြစ်သည်။ လွန်ခဲ့သော နှစ်များနည်းတူ သင်ခန်းစာများကို ဗီဒီယိုရိုက်ကူးပြီး ရိုက်ကူးချက်များကို အွန်လိုင်း တွင် တင်ဆက်ပေးသွားမည်ဖြစ်သည်။

၁ နာရီကြာ သင်ခန်းစာ အနည်းငယ်အတွင်း အကြောင်းအရာ အမြောက်အမြားကို လွှမ်းခြုံနိုင်ရန် ကြိုးစားထားသောကြောင့် သင်ခန်းစာများသည် တော်တော်လေး စိတ်အာရုံစိုက်ရန် လိုအပ်ပါသည်။ မိမိ၏ လေ့လာနိုင်သော နှုန်းအတိုင်း အကြောင်းအရာများနှင့် ရင်းနှီးကျွမ်းကျင်စေရန်အတွက် သင်ခန်းစာတစ်ခုစီတွင် သော့ချက်အချက်များကို လမ်းညွှန်ပေးသည့် လေ့ကျင့်ခန်းများ ပါဝင်ပါသည်။ ကျွန်ုပ်တို့သည် သီးသန့် အမေးအဖြေပြုလုပ်ရန် Office Hours သတ်မှတ်ထားခြင်း မရှိသော်လည်း OSSU Discord ၏ #missing-semester-forum တွင် မေးခွန်းများ မေးမြန်းရန် သို့မဟုတ် missing-semester@mit.edu သို့ အီးမေးလ် ပေးပို့ရန် တိုက်တွန်းပါသည်။

အချိန်ကန့်သတ်ချက်ကြောင့် tool တစ်ခုချင်းစီကို အပြည့်အဝသင်တန်းတစ်ခုကဲ့သို့ အသေးစိတ်အချက်အလက်များအတိုင်း လွှမ်းခြုံနိုင်မည် မဟုတ်ပါ။ ဖြစ်နိုင်သမျှ tool သို့မဟုတ် ခေါင်းစဉ်တစ်ခုကို ပိုမိုနက်ရှိုင်းစွာ လေ့လာနိုင်ရန် အရင်းအမြစ်များကို လမ်းညွှန်ပေးရန် ကြိုးစားသွားမည်ဖြစ်သော်လည်း အထူးစိတ်ဝင်စားသည့် အကြောင်းအရာတစ်ခုခု ရှိပါက ကျွန်ုပ်တို့ထံ ဆက်သွယ်၍ လမ်းညွှန်ချက်များ တောင်းခံရန် တွန့်ဆုတ်မနေပါနှင့်!

နောက်ဆုံးအနေဖြင့် သင်တန်းနှင့်ပတ်သက်၍ အကြံပြုချက်များရှိပါက missing-semester@mit.edu သို့ အီးမေးလ်မှတစ်ဆင့် ပေးပို့နိုင်ပါသည်။

ခေါင်းစဉ် ၁ - Shell

Shell ဆိုတာ ဘာလဲ။

ယနေ့ခေတ် ကွန်ပျူတာများတွင် ညွှန်ကြားချက်များ ပေးပို့ရန်အတွက် interface (မျက်နှာပြင်) အမျိုးမျိုး ရှိကြပါသည်။ ဆန်းသစ်သော graphical user interfaces၊ အသံဖြင့် ညွှန်ကြားသည့် interfaces၊ AR/VR နှင့် မကြာသေးမီက ပေါ်ပေါက်လာသော LLM များ ဖြစ်ကြသည်။ ၎င်းတို့သည် အသုံးပြုမှု အခြေအနေ ၈၀% အတွက် အဆင်ပြေ သော်လည်း လုပ်ဆောင်နိုင်စွမ်းတွင် အခြေခံအားဖြင့် ကန့်သတ်ချက်များ ရှိတတ်ကြသည် — မရှိသေးသော ခလုတ်တစ်ခုကို နှိပ်၍ မရနိုင်သလို၊ ပရိုဂရမ် ရေးဆွဲမထားသော အသံမိန့်န့်ခွန်းကိုလည်း ပေး၍ မရနိုင်ပါ။ သင်၏ ကွန်ပျူတာက ပံ့ပိုးပေးထားသော tools များကို အပြည့်အဝ အသုံးချနိုင်ရန် ရှေးမူမပျက် စာသားအခြေပြု interface ဖြစ်သည့် Shell သို့ ဆင်းသက် အသုံးပြုရမည် ဖြစ်သည်။

သင် အသုံးပြုနိုင်သည့် ပလပ်ဖောင်း တိုင်းနီးပါးတွင် ပုံစံတစ်မျိုးမျိုးဖြင့် Shell ပါဝင်ပြီး၊ ၎င်းတို့အနက် အများအပြားတွင် ရွေးချယ်စရာ Shell အမြောက်အမြား ရှိကြသည်။ အသေးစိတ် အချက်အလက်များတွင် ကွဲပြားနိုင်သော်လည်း အဓိက သဘောတရားအားဖြင့် အားလုံး နီးပါး တူညီကြသည် - ပရိုဂရမ်များကို စေခိုင်းခြင်း၊ ၎င်းတို့ထံ input များ ပေးပို့ခြင်းနှင့် ၎င်းတို့၏ output များကို ပုံစံတကျ စစ်ဆေးကြည့်ရှုခြင်းများကို ပြုလုပ်နိုင်စေပါသည်။

Shell prompt (ညွှန်ကြားချက်များ ရိုက်ထည့်နိုင်သည့်နေရာ) ကို ဖွင့်ရန်အတွက် ရှေးဦးစွာ Shell ၏ မြင်ကွင်း interface ဖြစ်သော terminal တစ်ခု လိုအပ်ပါသည်။ သင်၏ စက်ပစ္စည်းတွင် တစ်ခု စက်ရုံထုတ် ပါဝင်ပြီးသား ဖြစ်နိုင်သည် သို့မဟုတ် အလွယ်တကူ တပ်ဆင် install လုပ်နိုင်သည်-

Linux နှင့် macOS တို့တွင် ၎င်းသည် Bourne Again SHell သို့မဟုတ် အတိုကောက် “bash” ကို ပုံမှန်အားဖြင့် ဖွင့်ပေးမည် ဖြစ်သည်။ ဤသည်မှာ အသုံးအများဆုံး Shell များထဲမှ တစ်ခုဖြစ်ပြီး၊ ၎င်း၏ syntax သည် အခြား Shell အများအပြားတွင် တွေ့ရမည် ဖြစ်သည့်အတိုင်း တူညီလှသည်။ Windows တွင်မူ သင် မည်သည့် command ဖွင့်ခဲ့သည်အပေါ် မူတည်၍ “batch” သို့မဟုတ် “powershell” Shell များဖြင့် ကြိုဆိုမည် ဖြစ်သည်။ ၎င်းတို့သည် Windows သီးသန့်ဖြစ်ပြီး ဤသင်တန်းတွင် အဓိက ထား သင်ကြားမည် မဟုတ်ပါ (သို့သော်လည်း ကျွန်ုပ်တို့ သင်ကြားမည့် အကြောင်းအရာ အများစုအတွက် တူညီသော သဘောတရားများ ရှိကြသည်)။ ထို့အစား Windows Subsystem for Linux သို့မဟုတ် Linux virtual machine တစ်ခုကို အသုံးပြုရန် လိုအပ်မည် ဖြစ်သည်။

bash ထက် အသုံးပြုရ ပိုမို အဆင်ပြေစေသည့် မွမ်းမံမှုများ ပါဝင်သော အခြား Shell များလည်း ရှိကြသည် (fish နှင့် zsh တို့မှာ အသုံးအများဆုံးထဲတွင် ပါဝင်သည်)။ ၎င်းတို့သည် လူကြိုက်များသော်လည်း (ဆရာအားလုံးလည်း တစ်ခုခုကို အသုံးပြုကြသည်) bash ကဲ့သို့ နေရာတိုင်းတွင် မရှိနိုင်သကဲ့သို့ တူညီသော သဘောတရားများပေါ်တွင် မှီခိုနေသဖြင့် ဤသင်ခန်းစာတွင် ၎င်းတို့ကို အဓိကထားမည် မဟုတ်ပါ။

ဒါကို ဘာကြောင့် စိတ်ဝင်စားသင့်သလဲ။

Shell သည် “မောက်စ်ဖြင့် လိုက်ကလစ်နှိပ်ခြင်း” ထက် (ပုံမှန်အားဖြင့်) ပိုမို မြန်ဆန်ရုံသာမက မည်သည့် graphical ပရိုဂရမ်တစ်ခုတွင်မှ အလွယ်တကူ ရှာမတွေ့နိုင်သော ဖော်ပြနိုင်စွမ်းအား ပါဝင်သည်။ နောက်ပိုင်းတွင် တွေ့မြင်ရမည့်အတိုင်း Shell သည် ပရိုဂရမ်များကို တီထွင်ဖန်တီးမှုရှိသော နည်းလမ်းများဖြင့် ပေါင်းစပ် ပြီး မည်သည့် လုပ်ငန်းမဆို အလိုအလျောက် ဆောင်ရွက်နိုင်စေသည့် စွမ်းရည်ကို ပေးစွမ်းသည်။

Shell အသုံးပြုပုံကို ကျွမ်းကျင်စွာ သိရှိခြင်းသည် Open-source ဆော့ဖ်ဝဲလ် ကမ္ဘာကို လေ့လာစုံစမ်းရာတွင်လည်းကောင်း (၎င်းတို့တွင် Shell ကို သုံးရသည့် တပ်ဆင်မှု ညွှန်ကြားချက်များ ပါဝင်လေ့ရှိသည်)၊ သင်၏ ဆော့ဖ်ဝဲလ် ပရောဂျက်များအတွက် Continuous Integration တည်ဆောက်ရာတွင်လည်းကောင်း (Code Quality သင်ခန်းစာ တွင် ဖော်ပြထားသည့်အတိုင်း)၊ အခြား ပရိုဂရမ်များ ထိခိုက်ပျက်စီးသည့်အခါ အမှားများကို ရှာဖွေ ပြင်ဆင်ရာတွင်လည်းကောင်း အလွန် အသုံးဝင်ပါသည်။

Shell တွင် လမ်းကြောင်းရှာဖွေ သွားလာခြင်း

Terminal ကို စတင်ဖွင့်လိုက်သည့်အခါ ဤကဲ့သို့ တွေ့ရလေ့ရှိသော prompt တစ်ခုကို မြင်တွေ့ရမည် ဖြစ်သည်-

missing:~$

ဤသည်မှာ Shell ၏ အဓိက စာသား interface ဖြစ်သည်။ သင်သည် missing ဟုခေါ်သော စက်ထဲတွင် ရောက်ရှိနေပြီး၊ သင်၏ “လက်ရှိ အလုပ်လုပ်နေသည့် ဖိုဒါလမ်းကြောင်း (current working directory)” သို့မဟုတ် လက်ရှိ ရောက်ရှိနေသည့် နေရာမှာ ~ (“home” ၏ အတိုကောက်) ဖြစ်ကြောင်း ဖော်ပြသည်။ $ က သင်သည် root အသုံးပြုသူ မဟုတ်ကြောင်း ဖော်ပြသည် (ထိုအကြောင်းကို နောက်မှ အသေးစိတ် ပြောပါမည်)။ ဤ prompt တွင် သင်သည် command တစ်ခု ရိုက်ထည့်နိုင်ပြီး ထို command ကို Shell မှ ဘာသာပြန် လုပ်ဆောင်ပေးမည် ဖြစ်သည်။ အခြေခံအကျဆုံး command မှာ ပရိုဂရမ်တစ်ခုကို စေခိုင်း run ခြင်း ဖြစ်သည်-

missing:~$ date
Fri 10 Jan 2020 11:49:31 AM EST
missing:~$

ဤနေရာတွင် ကျွန်ုပ်တို့သည် date ပရိုဂရမ်ကို run ခဲ့ပြီး၊ ၎င်းသည် (မျှော်လင့်ထားသည့်အတိုင်း) လက်ရှိ ရက်စွဲနှင့် အချိန်ကို ရိုက်နှိပ်ပြသပေးသည်။ ထို့နောက် Shell က ကျွန်ုပ်တို့အား နောက်ထပ် run မည့် command တစ်ခု ရိုက်ထည့်ရန် တောင်းဆိုသည်။ ကျွန်ုပ်တို့သည် command တစ်ခုကို arguments (အချက်အလက်များ) နှင့်အတူလည်း run နိုင်သည်။

missing:~$ echo hello
hello

ဤနေရာတွင် ကျွန်ုပ်တို့သည် echo ပရိုဂရမ်ကို hello ဆိုသည့် argument နှင့်အတူ run ရန် Shell အား ညွှန်ကြားခဲ့သည်။ echo ပရိုဂရမ်သည် ၎င်းထံ ပေးပို့လိုက်သော argument များကို ရိုးရှင်းစွာ ပြန်လည် ရိုက်နှိပ်ပေးခြင်း ဖြစ်သည်။ Shell သည် command ကို ဟာကွက် (whitespace) များဖြင့် ပိုင်းခြား၍ စစ်ဆေးပြီး ပထမစကားလုံးဖြင့် ညွှန်ပြသော ပရိုဂရမ်ကို run ကာ နောက်ဆက်တွဲ စကားလုံးများကို ပရိုဂရမ် အသုံးပြုနိုင်သည့် argument များအဖြစ် ပေးပို့သည်။ အကယ်၍ သင်သည် ကွက်လပ်များ သို့မဟုတ် အထူးသင်္ကေတများ ပါဝင်သော argument တစ်ခု (ဥပမာ- “My Photos” ဟု အမည်ရသော ဖိုဒါ) ကို ပေးပို့လိုပါက argument ကို ' သို့မဟုတ် " ဖြင့် သတ်မှတ်နိုင်သည် ("My Photos")၊ သို့မဟုတ် သက်ဆိုင်ရာ သင်္ကေတများကို \ ဖြင့် escape လုပ်နိုင်သည် (My\ Photos)။

စတင်လေ့လာချိန်တွင် အရေးကြီးဆုံး command မှာ “manual” ၏ အတိုကောက် ဖြစ်သော man command ဖြစ်ပေလိမ့်မည်။ man ပရိုဂရမ်သည် အခြားအရာများအပြင် သင်၏ system ပေါ်ရှိ မည်သည့် command ၏ အသေးစိတ် အချက်အလက်များကိုမဆို ရှာဖွေ ကြည့်ရှုနိုင်စေသည်။ ဥပမာအားဖြင့် man date ကို run ပါက date ဆိုသည်မှာ ဘာလဲဆိုသည်နှင့် ၎င်း၏ လုပ်ဆောင်ချက်ကို ပြောင်းလဲရန် ပေးပို့နိုင်သည့် argument အမျိုးမျိုးကို ရှင်းပြပေးမည် ဖြစ်သည်။ command အများစုအတွက် --help ကို argument အဖြစ် ပေးပို့ခြင်းဖြင့်လည်း ကူညီမှု အတိုချုပ်ကို ရရှိနိုင်လေ့ ရှိသည်။

man အပြင် tldr ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ၊ ၎င်းသည် အသုံးများသော ဥပမာများကို terminal ထဲတွင်ပင် တိုက်ရိုက် ပြသပေးသောကြောင့် ဖြစ်သည်။ LLM များသည်လည်း command များ မည်သို့ အလုပ်လုပ်ကြောင်းနှင့် မိမိ လိုချင်သည့် ရလဒ် ရရှိရန် မည်သို့ ခေါ်ယူသုံးစွဲရကြောင်း ရှင်းပြရာတွင် အလွန် ကောင်းမွန်ကြသည်။

man ပြီးလျှင် လေ့လာရန် အရေးကြီးဆုံး command မှာ “change directory” ၏ အတိုကောက်ဖြစ်သော cd ဖြစ်သည်။ ဤ command သည် သီးခြား ပရိုဂရမ် မဟုတ်ဘဲ Shell ထဲတွင် တိုက်ရိုက် ပါဝင်ပြီးသား (built-in) ဖြစ်သည် (ဥပမာ- which cd ကို run ပါက “no cd found” ဟု ဖော်ပြလိမ့်မည်)။ သင်သည် လမ်းကြောင်း path တစ်ခု ပေးပို့လိုက်ပါက ထို path သည် သင်၏ လက်ရှိ အလုပ်လုပ်နေသော ဖိုဒါလမ်းကြောင်း ဖြစ်လာမည် ဖြစ်သည်။ လက်ရှိ ရောက်ရှိနေသော ဖိုဒါလမ်းကြောင်းကို Shell prompt တွင်လည်း တွေ့မြင်ရမည် ဖြစ်သည်-

missing:~$ cd /bin
missing:/bin$ cd /
missing:/$ cd ~
missing:~$

Shell တွင် auto-completion ပါဝင်သောကြောင့် <TAB> ကို နှိပ်ခြင်းဖြင့် လမ်းကြောင်းများကို ပိုမို မြန်ဆန်စွာ ရိုက်ထည့်နိုင်သည်ကို သတိပြုပါ!

အခြားနေရာ သီးသန့် မသတ်မှတ်ထားပါက command အများစုသည် လက်ရှိ အလုပ်လုပ်နေသော ဖိုဒါလမ်းကြောင်းပေါ်တွင် လုပ်ဆောင်ကြသည်။ သင် မည်သည့်နေရာတွင် ရောက်ရှိနေသည်ကို မသေချာပါက pwd ကို run နိုင်သည် သို့မဟုတ် $PWD environment variable ကို ရိုက်နှိပ်ကြည့်နိုင်သည် (echo $PWD ဖြင့်)၊ ၎င်းတို့ နှစ်ခုလုံးသည် လက်ရှိ ရောက်ရှိနေသော ဖိုဒါလမ်းကြောင်းကို ပြသပေးမည် ဖြစ်သည်။

လက်ရှိ အလုပ်လုပ်နေသော ဖိုဒါလမ်းကြောင်းသည် relative (နှိုင်းယှဉ်) paths များကို အသုံးပြုနိုင်စေသည့်အတွက်လည်း အလွန် အဆင်ပြေသည်။ ယခုအထိ ကျွန်ုပ်တို့ တွေ့ခဲ့ရသော paths အားလုံးသည် absolute (အပြည့်အစုံ) paths များ ဖြစ်ကြသည် — ၎င်းတို့သည် / ဖြင့် စတင်ပြီး file system ၏ root (/) မှစ၍ မည်သည့် နေရာသို့မဆို သွားရောက်နိုင်သည့် ဖိုဒါလမ်းကြောင်း အပြည့်အစုံကို ပေးသည်။ လက်တွေ့တွင် relative paths များကို ပိုမို သုံးလေ့ ရှိကြသည်၊ အကြောင်းမှာ ၎င်းတို့သည် လက်ရှိ ဖိုဒါလမ်းကြောင်းအပေါ် မူတည်၍ သတ်မှတ်သောကြောင့် ဖြစ်သည်။ Relative path တစ်ခုတွင် (/ ဖြင့် စမထားသော မည်သည့် path မဆို) ပထမဆုံး လမ်းကြောင်း အစိတ်အပိုင်းကို လက်ရှိ ဖိုဒါထဲတွင် ရှာဖွေပြီး နောက်ဆက်တွဲ အစိတ်အပိုင်းများကို ပုံမှန်အတိုင်း ဆက်လက် သွားရောက်သည်။ ဥပမာအားဖြင့်-

missing:~$ cd /
missing:/$ cd bin
missing:/bin$

ဖိုဒါတိုင်းတွင် ရှိနေသော “အထူး” အစိတ်အပိုင်း နှစ်ခုလည်း ရှိသည်- . နှင့် .. တို့ ဖြစ်ကြသည်။ . မှာ “ဤလက်ရှိ ဖိုဒါ” ဖြစ်ပြီး .. မှာ “အထက်ဖိုဒါ (parent directory)” ဖြစ်သည်။ ထို့ကြောင့်-

missing:~$ cd /
missing:/$ cd bin/../bin/../bin/././../bin/..
missing:/$

command argument မည်သည့်အရာအတွက်မဆို absolute နှင့် relative paths များကို အပြန်အလှန် လဲလှယ် အသုံးပြုနိုင်လေ့ ရှိသည်၊ relative path ကို သုံးသည့်အခါ မိမိ၏ လက်ရှိ ရောက်ရှိနေသော ဖိုဒါလမ်းကြောင်း မည်သည်ဖြစ်ကြောင်းကိုသာ သတိရပါ။

cd ဖြင့် သွားလာခြင်းကို မြန်ဆန်စေရန် zoxide ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ — z သည် သင် မကြာခဏ သွားရောက်လေ့ရှိသော လမ်းကြောင်းများကို မှတ်သားထားပြီး အနည်းငယ်မျှ ရိုက်ထည့်ရုံဖြင့် ဝင်ရောက်နိုင်စေသည်။

Shell တွင် မည်သည့် tools များ ရရှိနိုင်သနည်း။

သို့သော် Shell သည် date သို့မဟုတ် echo ကဲ့သို့သော ပရိုဂရမ်များကို မည်သို့ ရှာဖွေရမည်ကို မည်သို့ သိရှိသနည်း။ Shell အား command တစ်ခုကို run ရန် ခိုင်းစေသည့်အခါ ၎င်းသည် command ပေးလိုက်သည့်အခါ မည်သည့် ဖိုဒါများတွင် ရှာဖွေရမည်ကို စာရင်းပြုစုထားသော $PATH ဟုခေါ်သည့် environment variable ကို တိုင်ပင်စစ်ဆေးသည်-

missing:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
missing:~$ which echo
/bin/echo
missing:~$ /bin/echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

ကျွန်ုပ်တို့သည် echo command ကို run သည့်အခါ Shell သည် echo ပရိုဂရမ်ကို စေခိုင်းရမည်ဖြစ်ကြောင်း သိရှိပြီး $PATH ထဲရှိ : ဖြင့် ပိုင်းခြားထားသော ဖိုဒါစာရင်းများတွင် ထိုအမည်ရှိသော file ကို ရှာဖွေသည်။ တွေ့ရှိပါက run ပေးသည် (file သည် executable မောင်းနှင်နိုင်သော file ဖြစ်သည်ဟု ယူဆပါသည်၊ ထိုအကြောင်းကို နောက်မှ အသေးစိတ် ပြောပါမည်)။ which ပရိုဂရမ်ကို အသုံးပြု၍ ပေးထားသော ပရိုဂရမ်အမည်အတွက် မည်သည့် file ကို မောင်းနှင်ရမည်ကို ရှာဖွေနိုင်သည်။ ကျွန်ုပ်တို့ မောင်းနှင်လိုသော file ၏ path လမ်းကြောင်းကို တိုက်ရိုက် ပေးပို့ခြင်းဖြင့် $PATH ကို သုံးစရာမလိုဘဲ တိုက်ရိုက် run နိုင်သည်။

ဤသည်မှာ Shell တွင် ကျွန်ုပ်တို့ run နိုင်သော ပရိုဂရမ်များ အားလုံး ကို မည်သို့ သိရှိနိုင်သနည်းဆိုသည်အတွက် အရိပ်အမြွက် ပေးသည်- $PATH ပေါ်ရှိ ဖိုဒါများအားလုံး၏ ပါဝင်သည့် အရာများကို စာရင်းထုတ်ကြည့်ခြင်း ဖြင့် ဖြစ်သည်။ file များကို စာရင်းထုတ်ပေးသော ls ပရိုဂရမ်သို့ ဖိုဒါ path တစ်ခု ပေးပို့ခြင်းဖြင့် ဤသို့ ပြုလုပ်နိုင်သည်-

missing:~$ ls /bin

ပိုမို အဆင်ပြေသော ls အတွေ့အကြုံအတွက် eza ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ။

ကွန်ပျူတာ အများစုတွင် ဤသို့ပြုလုပ်ပါက ပရိုဂရမ် အမြောက်အမြားကို ပြသပေးမည် ဖြစ်သော်လည်း ဤနေရာတွင် အရေးကြီးဆုံး အချို့ကိုသာ အဓိကထားသွားပါမည်။ ပထမဦးစွာ ရိုးရှင်းသော အချို့မှာ-

စာသားများ အရောင်စုံ ပြသနိုင်ရန်နှင့် Scrolling ပြုလုပ်နိုင်ရန် cat အစား bat ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ။

file ထဲတွင် pattern နှင့် ကိုက်ညီသော စာကြောင်းများကို ရှာဖွေပေးသည့် grep pattern file လည်း ရှိသည်။ ဤ command သည် အလွန် အသုံးဝင်သကဲ့သို့ မျှော်လင့်ထားသည်ထက် ပိုမိုကျယ်ပြန့်သော လုပ်ဆောင်ချက်များ ပါဝင်သဖြင့် ပိုမို အာရုံစိုက်ရန် ထိုက်တန်ပါသည်။ pattern ဆိုသည်မှာ အမှန်တကယ်တွင် အလွန် ရှုပ်ထွေးသော ပုံစံများကို ဖော်ပြနိုင်သည့် regular expression ဖြစ်သည် — ထိုအကြောင်းကို Code Quality သင်ခန်းစာ တွင် လွှမ်းခြုံ ဖော်ပြသွားမည် ဖြစ်သည်။ file တစ်ခုအစား ဖိုဒါတစ်ခုကိုလည်း သတ်မှတ်နိုင်ပြီး (သို့မဟုတ် . အတွက် ချန်လှပ်ထားနိုင်သည်) ဖိုဒါတစ်ခုအတွင်းရှိ file အားလုံးကို အဆင့်ဆင့် ရှာဖွေရန် -r ကို ပေးပို့နိုင်သည်။

ပိုမို မြန်ဆန်ပြီး အသုံးပြုရ လွယ်ကူသော (သို့သော် ရွှေ့ပြောင်းအသုံးပြုရမှု အနည်းငယ် လျော့နည်းသော) အခြားရွေးချယ်စရာအဖြစ် grep အစား ripgrep ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ။ ripgrep သည် ပုံမှန်အားဖြင့် လက်ရှိ အလုပ်လုပ်နေသော ဖိုဒါကိုလည်း အလိုအလျောက် အဆင့်ဆင့် ရှာဖွေပေးမည် ဖြစ်သည်!

အနည်းငယ် ပိုမို ရှုပ်ထွေးသော interface ရှိသည့် အလွန် အသုံးဝင်သော tools များလည်း ရှိသည်။ ထိုအထဲမှ ပထမဆုံးမှာ ပရိုဂရမ်ဆန်သော file အယ်ဒီတာ ဖြစ်သည့် sed ဖြစ်သည်။ ၎င်းတွင် file များကို အလိုအလျောက် ပြင်ဆင်ရန် ကိုယ်ပိုင် ပရိုဂရမ်မင်း ဘာသာစကား ပါဝင်သော်လည်း အသုံးအများဆုံး နည်းလမ်းမှာ-

missing:~$ sed -i 's/pattern/replacement/g' file

ဤသည်မှာ file ထဲရှိ pattern နေရာများ အားလုံးကို replacement ဖြင့် အစားထိုးပေးသည်။ -i က အစားထိုးမှုများကို inline တိုက်ရိုက် ပြုလုပ်စေလိုကြောင်း ပြသသည် (file ကို မပြင်ဘဲ အစားထိုးထားသော အကြောင်းအရာများကို ရိုက်နှိပ်ပြခြင်း မဟုတ်ပါ)။ s/ မှာ အစားထိုးလိုကြောင်း sed ပရိုဂရမ်မင်း ဘာသာစကားတွင် ဖော်ပြသည့် နည်းလမ်းဖြစ်သည်။ / က pattern နှင့် replacement ကို ပိုင်းခြားပေးသည်။ နောက်ဆုံးရှိ /g က စာကြောင်းတစ်ကြောင်းစီရှိ ပထမဆုံး တစ်ခုတည်း မဟုတ်ဘဲ ပါဝင်သမျှ အားလုံးကို အစားထိုးလိုကြောင်း ပြသသည်။ grep နည်းတူ ဤနေရာမှ pattern သည် regular expression ဖြစ်ပြီး ကြီးမားသော ဖော်ပြနိုင်စွမ်းကို ပေးသည်။ Regular expression အစားထိုးမှုများသည် replacement အား ကိုက်ညီသော pattern ၏ အစိတ်အပိုင်းများကို ပြန်လည် ရည်ညွှန်းနိုင်စေသည်၊ ထိုအကြောင်း ဥပမာတစ်ခုကို ခဏအတွင်း တွေ့ရပါမည်။

နောက်တစ်ခုမှာ သတ်မှတ်ထားသော အခြေအနေများနှင့် ကိုက်ညီသော file များကို (အဆင့်ဆင့်) ရှာဖွေနိုင်သည့် find ဖြစ်သည်။ ဥပမာအားဖြင့်-

missing:~$ find ~/Downloads -type f -name "*.zip" -mtime +30

Download ဖိုဒါထဲရှိ ရက်ပေါင်း ၃၀ ထက် ဟောင်းနွမ်းသော ZIP file များကို ရှာဖွေပေးသည်။

missing:~$ find ~ -type f -size +100M -exec ls -lh {} \;

Home ဖိုဒါထဲရှိ 100M ထက် ကြီးသော file များကို ရှာဖွေ၍ စာရင်းထုတ်ပေးသည်။ -exec သည် တန်းလန်း ; ဖြင့် ဆုံးသော command တစ်ခုကို ယူဆောင်ပြီး (ဟာကွက်ကဲ့သို့ပင် escape လုပ်ရန် လိုအပ်သည်)၊ ထိုနေရာတွင် {} ကို ကိုက်ညီသော file path တစ်ခုစီဖြင့် find က အစားထိုးပေးကြောင်း သတိပြုပါ။

missing:~$ find . -name "*.py" -exec grep -l "TODO" {} \;

TODO အကြောင်းအရာများ ပါရှိသော မည်သည့် .py file များကိုမဆို ရှာဖွေပေးသည်။

find ၏ syntax သည် အနည်းငယ် ခက်ခဲနိုင်သော်လည်း ၎င်းသည် မည်မျှ အသုံးဝင်ကြောင်း သဘောပေါက်နိုင်မည်ဟု မျှော်လင့်ပါသည်။

find အစား ပိုမို အသုံးပြုရ လွယ်ကူသော အတွေ့အကြုံအတွက် fd ကို တပ်ဆင် အသုံးပြုရန် စဉ်းစားကြည့်ပါ (သို့သော် ရွှေ့ပြောင်းသုံးစွဲနိုင်မှု အနည်းငယ် လျော့နည်းသည်)။

နောက်ထပ် လေ့လာရမည်မှာ sed ကဲ့သို့ပင် ကိုယ်ပိုင် ပရိုဂရမ်မင်း ဘာသာစကား ပါရှိသော awk ဖြစ်သည်။ sed ကို file များ ပြင်ဆင်ရန် တည်ဆောက်ထားပြီး awk ကိုမူ ၎င်းတို့ကို စစ်ဆေး ဘာသာပြန်ရန် တည်ဆောက်ထားသည်။ awk ၏ အသုံးအများဆုံး နည်းလမ်းမှာ မှတ်တမ်း (စာကြောင်း) တိုင်း၏ အစိတ်အပိုင်း အချို့ကိုသာ ထုတ်ယူလိုသော ပုံမှန် syntax ပါရှိသည့် ဒေတာ file များ (CSV file များကဲ့သို့) အတွက် ဖြစ်သည်-

missing:~$ awk '{print $2}' file

file ၏ စာကြောင်းတိုင်းရှိ ဟာကွက်ဖြင့် ပိုင်းခြားထားသော ဒုတိယ ကော်လံကို ရိုက်နှိပ်ပေးသည်။ -F, ကို ထည့်သွင်းပါက ကော်မာဖြင့် ပိုင်းခြားထားသော ဒုတိယ ကော်လံကို ရိုက်နှိပ်ပေးမည် ဖြစ်သည်။ awk သည် စာကြောင်းများ စစ်ထုတ်ခြင်း၊ စုစုပေါင်း တွက်ချက်ခြင်း စသည်ဖြင့် ပိုမို ပြုလုပ်နိုင်ပါသည် — နမူနာအဖြစ် လေ့ကျင့်ခန်းများကို ကြည့်ပါ။

ဤ tools များကို ပေါင်းစပ်လိုက်လျှင် ဤကဲ့သို့ ဆန်းသစ်သော အရာများကို ပြုလုပ်နိုင်သည်-

missing:~$ ssh myserver 'journalctl -u sshd -b-1 | grep "Disconnected from"' \
  | sed -E 's/.*Disconnected from .* user (.*) [^ ]+ port.*/\1/' \
  | sort | uniq -c \
  | sort -nk1,1 | tail -n10 \
  | awk '{print $2}' | paste -sd,
postgres,mysql,oracle,dell,ubuntu,inspur,test,admin,user,root

ဤသည်မှာ Remote server တစ်ခုမှ SSH logs များကို ရယူပြီး (ssh အကြောင်းကို နောက်သင်ခန်းစာတွင် ပိုမို ပြောပါမည်)၊ အဆက်အသွယ် ပြတ်တောက်မှု မက်ဆေ့ဂျ်များကို ရှာဖွေကာ၊ ထို မက်ဆေ့ဂျ်များမှ username ကို ထုတ်ယူ၍ အများဆုံး ပါဝင်သော သုံးစွဲသူ အမည် ၁၀ ခုကို ကော်မာခြားပြီး ရိုက်နှိပ်ပေးသည်။ command တစ်ခုတည်းဖြင့် ရရှိခြင်း ဖြစ်သည်! အဆင့်တစ်ခုစီကို အသေးစိတ် ခွဲခြားလေ့လာခြင်းကို လေ့ကျင့်ခန်းအဖြစ် ချန်လှပ်ထားပါမည်။

Shell ဘာသာစကား (bash)

ယခင် ဥပမာသည် သဘောတရား အသစ်တစ်ခုကို မိတ်ဆက်ပေးခဲ့သည်- pipes (|)။ ၎င်းတို့သည် ပရိုဂရမ်တစ်ခု၏ output ကို အခြား ပရိုဂရမ်တစ်ခု၏ input နှင့် ချိတ်ဆက်ပေးသည်။ command-line ပရိုဂရမ် အများစုသည် မည်သည့် file argument မျှ မပေးထားပါက ၎င်းတို့၏ “standard input” (ပုံမှန်အားဖြင့် သင် ရိုက်ထည့်သော စာသားများ ရောက်ရှိရာ) ပေါ်တွင် လုပ်ဆောင်သောကြောင့် ဤသို့ လုပ်ဆောင်နိုင်ခြင်း ဖြစ်သည်။ | သည် ၎င်း၏ ရှေ့ရှိ ပရိုဂရမ်မှ “standard output” (ပုံမှန်အားဖြင့် terminal တွင် ရိုက်နှိပ်ပြသရာ) ကို ယူပြီး | ၏ နောက်ရှိ ပရိုဂရမ်အတွက် standard input ဖြစ်စေသည်။ ဤသည်မှာ Shell ပရိုဂရမ်များကို ပေါင်းစပ် နိုင်စေပြီး Shell အား လုပ်ငန်းတွင်ကျယ်သော ဝန်းကျင်တစ်ခု ဖြစ်စေသည့် အချက်တစ်ခု ဖြစ်သည်!

အမှန်စင်စစ် Shell အများစုသည် Python သို့မဟုတ် Ruby ကဲ့သို့ပင် ပြည့်စုံသော ပရိုဂရမ်မင်း ဘာသာစကားကို (bash ကဲ့သို့) အကောင်အထည်ဖော်ထားကြသည်။ ၎င်းတွင် variables၊ conditionals၊ loops နှင့် functions များ ပါဝင်သည်။ သင်၏ Shell တွင် command များ run သည့်အခါ အမှန်တကယ်အားဖြင့် သင်သည် Shell မှ ဘာသာပြန်မည့် ကုဒ် အနည်းငယ်ကို ရေးသားနေခြင်း ဖြစ်သည်။ ယနေ့တွင် bash တစ်ခုလုံးကို သင်ကြားမည် မဟုတ်သော်လည်း အထူး အသုံးဝင်မည့် အစိတ်အပိုင်း အချို့ကို ဖော်ပြပေးပါမည်-

ပထမဦးစွာ Redirects များ- >file သည် ပရိုဂရမ်တစ်ခု၏ standard output ကို ယူပြီး terminal သို့ ရိုက်နှိပ်မပြဘဲ file ထဲသို့ ရေးသားပေးသည်။ ဤသည်မှာ နောက်ပိုင်းတွင် ဓာတ်ခွဲစစ်ဆေးရန် ပိုမို လွယ်ကူစေသည်။ >>file သည် file ကို ထပ်ရေး (overwrite) ခြင်း မပြုဘဲ စာကြောင်းများ ထပ်ပေါင်းပေးမည် ဖြစ်သည်။ ပရိုဂရမ်အတွက် standard input အဖြစ် ကီးဘုတ်အစား file မှ ဖတ်ရှုရန် Shell အား ညွှန်ကြားသည့် <file လည်း ရှိသည်။

ဤသည်မှာ tee ပရိုဂရမ်အကြောင်း ပြောပြရန် သင့်တော်သော အချိန်ဖြစ်ပါသည်။ tee သည် standard input ကို standard output သို့ ရိုက်နှိပ်ပေးမည်ဖြစ်သလို (cat ကဲ့သို့ပင်!) file ထဲသို့လည်း ရေးသားပေးမည် ဖြစ်သည်။ ထို့ကြောင့် verbose cmd | tee verbose.log | grep CRITICAL သည် terminal ကို သန့်ရှင်းစေပြီး ရလဒ်အပြည့်အစုံကို log file ထဲတွင် သိမ်းဆည်းပေးမည် ဖြစ်သည်!

နောက်တစ်ခုမှာ Conditionals များ- if command1; then command2; command3; fi သည် command1 ကို run မည်ဖြစ်ပြီး အမှား မရှိပါက command2 နှင့် command3 တို့ကို run မည်ဖြစ်သည်။ လိုအပ်ပါက else အခက်အလက်ကိုလည်း ထည့်သွင်းနိုင်သည်။ command1 အဖြစ် သုံးလေ့ရှိသော အသုံးအများဆုံး command မှာ test command ဖြစ်ပြီး အတိုကောက်အားဖြင့် [ ဟု ဖော်ပြလေ့ရှိကာ “file ရှိပါသလား” (test -f file / [ -f file ]) သို့မဟုတ် “string စာသား တူညီပါသလား” ([ "$var" = "string" ]) ကဲ့သို့ အခြေအနေများကို စစ်ဆေးပေးသည်။ bash တွင် ပိုမို “ဘေးကင်းသော” built-in test ပုံစံ ဖြစ်သည့် [[ ]] လည်း ရှိပြီး ကိုးကားချက် quoting ဆိုင်ရာ ပုံမှန်မဟုတ်သော မူမမှန်မှုများ ပိုမို နည်းပါးသည်။

Bash တွင် while နှင့် for ဆိုသည့် Loop ပုံစံ နှစ်မျိုး ပါဝင်သည်။ while command1; do command2; command3; done သည် command1 အမှားမရှိသမျှ ကာလပတ်လုံး တစ်ခုလုံးကို ထပ်ခါထပ်ခါ run နေမည်မှလွဲ၍ သက်ဆိုင်ရာ if command ကဲ့သို့ လုပ်ဆောင်သည်။ for varname in a b c d; do command; done သည် command ကို လေးကြိမ် run ပြီး ကြိမ်တိုင်းတွင် $varname ကို a၊ b၊ c၊ d တို့ဖြင့် သတ်မှတ်သည်။ အရာများကို တိုက်ရိုက် ရေးသားခြင်းထက် ဤကဲ့သို့သော “command substitution” ကို အသုံးပြုလေ့ ရှိကြသည်-

for i in $(seq 1 10); do

ဤသည်မှာ seq 1 10 command ကို run ပြီး (၁ မှ ၁၀ အထိ ကိန်းဂဏန်းများကို ရိုက်နှိပ်ပေးသည်) ထို command ၏ output ဖြင့် $() တစ်ခုလုံးကို အစားထိုးပေးသောကြောင့် အကြိမ် ၁၀ ကြိမ် လည်ပတ်သည့် for loop ကို ရရှိစေသည်။ ရှေးကျသော ကုဒ်များတွင် $() အစား backticks များကို (for i in `seq 1 10`; do ကဲ့သို့) တွေ့ရတတ်သော်လည်း $() ကို ထပ်ဆင့် (nested) အသုံးပြုနိုင်သောကြောင့် ၎င်းကိုသာ အဓိက သုံးစွဲသင့်ပါသည်။

ရှည်လျားသော shell scripts များကို သင်၏ prompt ထဲတွင် တိုက်ရိုက် ရေးသားနိုင်သော်လည်း .sh file တစ်ခုထဲသို့ ရေးသားလေ့ ရှိကြသည်။ ဥပမာအားဖြင့် မအောင်မြင်မချင်း ပရိုဂရမ်တစ်ခုကို loop ပတ်၍ run ပြီး မအောင်မြင်သော ပုံစံ၏ output ကိုသာ ရိုက်နှိပ်ပြသကာ အနောက်ကွယ်တွင် CPU အား ဝန်ပိစေမည့် script တစ်ခု ဖြစ်ပါသည် (မတည်ငြိမ်သော flaky tests များကို ပြန်လည် စမ်းသပ်ရာတွင် အသုံးဝင်သည်)-

#!/bin/bash
set -euo pipefail

# Start CPU stress in background
stress --cpu 8 &
STRESS_PID=$!

# Setup log file
LOGFILE="test_runs_$(date +%s).log"
echo "Logging to $LOGFILE"

# Run tests until one fails
RUN=1
while cargo test my_test > "$LOGFILE" 2>&1; do
    echo "Run $RUN passed"
    ((RUN++))
done

# Cleanup and report
kill $STRESS_PID
echo "Test failed on run $RUN"
echo "Last 20 lines of output:"
tail -n 20 "$LOGFILE"
echo "Full log: $LOGFILE"

ဤနေရာတွင် အသစ်အဆန်း အချို့ ပါဝင်ပြီး ပရိုဂရမ်များကို ပြိုင်တူ run ရန် အနောက်ကွယ် အလုပ်များ (&)၊ ပိုမို ရှုပ်ထွေးသော shell redirections နှင့် arithmetic expansion များကဲ့သို့ အသုံးဝင်သော shell command များ ရေးသားရာတွင် လေ့လာရန် အကြံပြုပါသည်။

ပရိုဂရမ်၏ ပထမ စာကြောင်း နှစ်ကြောင်းကို စိစစ်ကြည့်ရန် ထိုက်တန်ပါသည်။ ပထမ စာကြောင်းမှာ “shebang” ဖြစ်ပြီး shell scripts မဟုတ်သော အခြား file ၏ အပေါ်ဆုံးတွင်လည်း တွေ့ရမည် ဖြစ်သည်။ #!/path ဖြင့် စတင်သော file တစ်ခုကို run သည့်အခါ Shell သည် /path ရှိ ပရိုဂရမ်ကို စတင်ပြီး file ၏ ပါဝင်သည့် အရာများကို input အဖြစ် ပေးပို့သည်။ Shell script တစ်ခုတွင် ဤသည်မှာ shell script ကို /bin/bash သို့ ပေးပို့ခြင်းဖြစ်ပြီး Python script များကိုလည်း /usr/bin/python shebang စာကြောင်းဖြင့် ရေးသားနိုင်ပါသည်!

ဒုတိယ စာကြောင်းမှာ bash ကို ပိုမို “တင်းကျပ်” စေပြီး shell scripts ရေးသားရာတွင် ဖြစ်လေ့ရှိသော အမှားများကို လျော့ပါးစေမည့် နည်းလမ်း ဖြစ်သည်။ set သည် argument အမြောက်အမြား ယူဆောင်နိုင်သော်လည်း အတိုချုပ်အားဖြင့်- -e သည် command တစ်ခုခု ပျက်စီးပါက script ကို စောစီးစွာ ထွက်ခွာစေသည်၊ -u သည် သတ်မှတ်မထားသော variables အသုံးပြုပါက စာသားအလွတ် အစား script ကို ထိခိုက်ရပ်တန့်စေသည်၊ -o pipefail သည် | တန်းစီဇယားထဲရှိ ပရိုဂရမ်များ ပျက်စီးပါက script တစ်ခုလုံးကို စောစီးစွာ ထွက်ခွာစေသည်။

Shell programming သည် အခြား ပရိုဂရမ်မင်း ဘာသာစကားများကဲ့သို့ပင် နက်ရှိုင်းသော ခေါင်းစဉ်ဖြစ်သော်လည်း သတိပြုပါ- bash တွင် ပုံမှန်မဟုတ်သော အမှားထောင်ချောက်များ (gotchas) အမြောက်အမြား ရှိနေပြီး ၎င်းတို့ကို စာရင်းပြုစုထားသော ဝက်ဘ်ဆိုက်များပင် အများအပြား ရှိကြသည်။ ၎င်းတို့ကို ရေးသားသည့်အခါ shellcheck ကို ထိရောက်စွာ အသုံးပြုရန် အလွန် အကြံပြုပါသည်။ LLM များသည်လည်း shell scripts များကို ရေးသားခြင်း၊ စစ်ဆေးခြင်းနှင့် bash ထက် ပိုမိုကြီးမားလာသောအခါ (စာကြောင်း ၁၀၀+) “အမှန်တကယ်” ပရိုဂရမ်မင်း ဘာသာစကား (Python ကဲ့သို့) သို့ ပြောင်းလဲပေးရာတွင် အလွန် ကောင်းမွန်ကြသည်။

နောက်ဆက်တွဲ လေ့လာရန်များ

ယခုအခါ အခြေခံ လုပ်ဆောင်ချက်များကို လုပ်ဆောင်နိုင်ရန်အတွက် Shell အသုံးပြုပုံကို ကျွမ်းကျင်စွာ သိရှိပြီး ဖြစ်သည်။ စိတ်ဝင်စားဖွယ် file များကို ရှာဖွေနိုင်ပြီး ပရိုဂရမ် အများစု၏ အခြေခံ လုပ်ဆောင်ချက်များကို အသုံးပြုနိုင်မည် ဖြစ်သည်။ နောက်သင်ခန်းစာတွင် Shell နှင့် tools command-line ပရိုဂရမ်များ အသုံးပြု၍ ပိုမို ရှုပ်ထွေးသော လုပ်ငန်းများကို အလိုအလျောက် ဆောင်ရွက်နည်းများအကြောင်း ပြောပြသွားပါမည်။

လေ့ကျင့်ခန်းများ

ဤသင်တန်းရှိ သင်ခန်းစာ အားလုံးတွင် လေ့ကျင့်ခန်းများ ပါဝင်သည်။ အချို့မှာ သီးခြား လုပ်ဆောင်ရမည့် အလုပ်တစ်ခုကို ပေးထားပြီး အချို့မှာ “X နှင့် Y ပရိုဂရမ်များကို အသုံးပြုကြည့်ပါ” ကဲ့သို့ ပွင့်လင်းသော လေ့ကျင့်ခန်းများ ဖြစ်ကြသည်။ ၎င်းတို့ကို စမ်းသပ်ကြည့်ရန် အလွန် တိုက်တွန်းပါသည်။

ကျွန်ုပ်တို့သည် လေ့ကျင့်ခန်းများအတွက် အဖြေများကို ရေးသားထားခြင်း မရှိပါ။ တစ်ခုခုတွင် အခက်အခဲ တွေ့ပါက Discord ရှိ #missing-semester-forum တွင် တင်ပြနိုင်သည် သို့မဟုတ် သင် ကြိုးစားထားသည်များကို အီးမေးလ် ပေးပို့နိုင်ပြီး ကျွန်ုပ်တို့ ကူညီပေးပါမည်။ ဤလေ့ကျင့်ခန်းများသည် LLM နှင့် စကားပြောရာတွင် ခေါင်းစဉ်ထဲသို့ အပြန်အလှန် လေ့လာနိုင်သည့် စတင်မှု prompts များအဖြစ်လည်း ကောင်းစွာ အလုပ်လုပ်ပါလိမ့်မည်။ ဤလေ့ကျင့်ခန်းများ၏ အစစ်အမှန် တန်ဖိုးမှာ အဖြေကိုယ်တိုင် မဟုတ်ဘဲ အဖြေကို ရှာဖွေတွေ့ရှိသည့် ခရီးစဉ် ဖြစ်သည်။ အဖြေသို့ ရောက်ရှိမည့် အတိုဆုံး လမ်းကြောင်းကိုသာ ရှာဖွေခြင်းထက် လေ့လာနေစဉ် ဆက်စပ်အကြောင်းအရာများကို လိုက်လေ့လာရန်နှင့် “ဘာကြောင့်လဲ” ဟု မေးခွန်းထုတ်ရန် တိုက်တွန်းပါသည်။

  1. ဤသင်တန်းအတွက် Bash သို့မဟုတ် ZSH ကဲ့သို့သော Unix shell တစ်ခုကို အသုံးပြုရန် လိုအပ်ပါသည်။ အကယ်၍ သင်သည် Linux သို့မဟုတ် macOS တွင် ရှိပါက သီးသန့် ပြုလုပ်ရန် မလိုပါ။ အကယ်၍ သင်သည် Windows တွင် ရှိပါက cmd.exe သို့မဟုတ် PowerShell ကို မသုံးကြောင်း သေချာပါစေ။ Unix ပုံစံ command-line tools များကို အသုံးပြုရန် Windows Subsystem for Linux သို့မဟုတ် Linux virtual machine တစ်ခုကို သုံးနိုင်သည်။ သင့်လျော်သော shell ကို run နေကြောင်း သေချာစေရန် echo $SHELL command ကို စမ်းကြည့်ပါ။ အကယ်၍ /bin/bash သို့မဟုတ် /usr/bin/zsh ကဲ့သို့ ဖော်ပြပါက မှန်ကန်သော ပရိုဂရမ်ကို run နေခြင်း ဖြစ်သည်။

  2. ls ၏ -l flag သည် မည်သို့ လုပ်ဆောင်သနည်း။ ls -l / ကို run ပြီး output ကို စိစစ်ပါ။ စာကြောင်းတစ်ကြောင်းစီ၏ ပထမဆုံး စာလုံး ၁၀ လုံးသည် မည်သည့် အဓိပ္ပာယ်လဲ။ (အကူအညီ- man ls)

  3. find ~/Downloads -type f -name "*.zip" -mtime +30 command တွင် *.zip သည် “glob” ဖြစ်သည်။ Glob ဆိုသည်မှာ ဘာလဲ။ file အချို့ ပါဝင်သော စမ်းသပ် ဖိုဒါတစ်ခု ဖန်တီးပြီး ls *.txt၊ ls file?.txt နှင့် ls {a,b,c}.txt ကဲ့သို့ ပုံစံများကို စမ်းသပ်ပါ။ Bash manual ရှိ Pattern Matching ကို ကြည့်ပါ။

  4. 'single quotes'၊ "double quotes" နှင့် $'ANSI quotes' တို့၏ ကွဲပြားချက်မှာ ဘာလဲ။ တိုက်ရိုက် $၊ ! နှင့် စာကြောင်းအသစ် (newline) စာလုံး ပါဝင်သော စာသားကို ရိုက်နှိပ်ပြသည့် command တစ်ခု ရေးပါ။ Quoting ကို ကြည့်ပါ။

  5. Shell တွင် ပုံမှန် stream သုံးခု ရှိသည်- stdin (0)၊ stdout (1) နှင့် stderr (2)။ ls /nonexistent /tmp ကို run ပြီး stdout ကို file တစ်ခုသို့လည်းကောင်း၊ stderr ကို အခြား file တစ်ခုသို့လည်းကောင်း redirect ပြုလုပ်ပါ။ နှစ်ခုလုံးကို file တစ်ခုတည်းသို့ မည်သို့ redirect လုပ်မည်နည်း။ Redirections ကို ကြည့်ပါ။

  6. $? တွင် နောက်ဆုံး command ၏ exit status ပါဝင်သည် (0 = အောင်မြင်မှု)။ && သည် ယခင် command အောင်မြင်ပါကမှ နောက် command ကို run ပြီး၊ || သည် ယခင် command မအောင်မြင်ပါကမှ run မည်။ /tmp/mydir မရှိသေးပါကမှ ဖန်တီးမည့် command တစ်ကြောင်း ရေးပါ။ Exit Status ကို ကြည့်ပါ။

  7. cd သည် သီးခြား ပရိုဂရမ်တစ်ခု မဟုတ်ဘဲ Shell ထဲတွင် တိုက်ရိုက် built-in အဖြစ် အဘယ်ကြောင့် ပါဝင်ရသနည်း။ (အကူအညီ- child process သည် parent process တွင် မည်သည့်အရာ ပြောင်းလဲနိုင်သည်၊ မပြောင်းလဲနိုင်သည်ကို စဉ်းစားပါ။)

  8. File အမည်ကို argument ($1) အဖြစ် ယူပြီး test -f သို့မဟုတ် [ -f ... ] သုံး၍ file ရှိမရှိ စစ်ဆေးသည့် script တစ်ခု ရေးပါ။ File ရှိမရှိအပေါ် မူတည်၍ မတူညီသော မက်ဆေ့ဂျ်များ ရိုက်နှိပ်ရမည်။ Bash Conditional Expressions ကို ကြည့်ပါ။

  9. ယခင် လေ့ကျင့်ခန်းမှ script ကို file ထဲသို့ သိမ်းဆည်းပါ (ဥပမာ- check.sh)။ ./check.sh somefile ဖြင့် run ကြည့်ပါ။ ဘာဖြစ်သနည်း။ ယခု chmod +x check.sh ကို run ပြီး ထပ်မံ စမ်းကြည့်ပါ။ ဤအဆင့်သည် အဘယ်ကြောင့် လိုအပ်သနည်း။ (အကူအညီ- chmod မတိုင်မီနှင့် အပြီးရှိ ls -l check.sh ကို ကြည့်ပါ။)

  10. Script ထဲရှိ set flags များတွင် -x ထည့်ပါက ဘာဖြစ်မည်နည်း။ ရိုးရှင်းသော script တစ်ခုဖြင့် စမ်းသပ်ကြည့်ပြီး output ကို လေ့လာပါ။ The Set Builtin ကို ကြည့်ပါ။

  11. File ကို ဒီနေ့ ရက်စွဲ ပါသော backup သို့ ကူးယူသည့် command တစ်ခု ရေးပါ (ဥပမာ- notes.txt → notes_2026-01-12.txt)။ (အကူအညီ- $(date +%Y-%m-%d))။ Command Substitution ကို ကြည့်ပါ။

  12. Lecture ထဲမှ မတည်ငြိမ်သော test script ကို cargo test my_test အစား test command ကို argument အဖြစ် လက်ခံရန် ပြင်ဆင်ပါ။ (အကူအညီ- $1 သို့မဟုတ် $@)။ Special Parameters ကို ကြည့်ပါ။

  13. Pipes ကို အသုံးပြု၍ သင့် home ဖိုဒါထဲရှိ အသုံးအများဆုံး file extensions ၅ ခုကို ရှာပါ။ (အကူအညီ- find၊ grep သို့မဟုတ် sed သို့မဟုတ် awk၊ sort၊ uniq -c နှင့် head တို့ကို ပေါင်းစပ်ပါ။)

  14. xargs သည် stdin မှ စာကြောင်းများကို command arguments သို့ ပြောင်းလဲပေးသည်။ find နှင့် xargs ကို အတူတကွ သုံး၍ (find -exec မဟုတ်ပါ) ဖိုဒါတစ်ခုထဲရှိ .sh file များအားလုံးကို ရှာပြီး wc -l ဖြင့် တစ်ခုစီ၏ စာကြောင်း အရေအတွက်ကို ရေတွက်ပါ။ အပိုဆောင်း- ဟာကွက်ပါသော file အမည်များကို ကိုင်တွယ်နိုင်အောင် ပြုလုပ်ပါ။ (အကူအညီ- -print0 နှင့် -0)။ man xargs ကို ကြည့်ပါ။

  15. curl ကို အသုံးပြု၍ သင်တန်း ဝက်ဘ်ဆိုက်၏ HTML ကို ရယူပါ (https://missing.csail.mit.edu/) ပြီးလျှင် သင်ခန်းစာ အရေအတွက် မည်မျှ စာရင်းပါဝင်ကြောင်း ရေတွက်ရန် grep သို့ pipe ပြုလုပ်ပါ။ (အကူအညီ- သင်ခန်းစာ တစ်ခုစီတွင် ပါဝင်သည့် ပုံစံကို ရှာပါ၊ တိုးတက်မှု output ကို ပိတ်ရန် curl -s ကို သုံးပါ။)

  16. jq သည် JSON ဒေတာများကို ကိုင်တွယ်ရန် စွမ်းအားထက်မြက်သော tool ဖြစ်သည်။ https://microsoftedge.github.io/Demos/json-dummy-data/64KB.json တွင်ရှိသော နမူနာ ဒေတာကို curl ဖြင့် ရယူပြီး version 6 ထက် ကြီးသော လူများ၏ အမည်များကိုသာ ထုတ်ယူရန် jq ကို သုံးပါ။ (အကူအညီ- ပုံသဏ္ဌာန်ကို ကြည့်ရန် ပထမဦးစွာ jq . သို့ pipe ပြုလုပ်ပါ၊ ထို့နောက် jq '.[] | select(...) | .name' ကို စမ်းသပ်ပါ။)

  17. awk သည် ကော်လံ တန်ဖိုးများပေါ် မူတည်၍ စာကြောင်းများကို စစ်ထုတ်နိုင်ပြီး output ကို ပြုပြင်နိုင်သည်။ ဥပမာအားဖြင့် awk '$3 ~ /pattern/ {$4=""; print}' သည် တတိယ ကော်လံ pattern နှင့် ကိုက်ညီသော စာကြောင်းများကိုသာ ရိုက်နှိပ်ပြီး စတုတ္ထ ကော်လံကို ချန်လှပ်ထားသည်။ ဒုတိယ ကော်လံ ၁၀၀ ထက် ကြီးသော စာကြောင်းများကိုသာ ရိုက်နှိပ်ပြီး ပထမနှင့် တတိယ ကော်လံများကို လဲလှယ်ပေးသည့် awk command တစ်ခု ရေးပါ။ printf 'a 50 x\nb 150 y\nc 200 z\n' ဖြင့် စမ်းသပ်ပါ။

  18. Lecture ထဲမှ SSH log pipeline ကို အသေးစိတ် စိစစ်ပါ- အဆင့်တစ်ခုစီသည် မည်သို့ လုပ်ဆောင်သနည်း။ ထို့နောက် ~/.bash_history (သို့မဟုတ် ~/.zsh_history) မှ အသုံးအများဆုံး shell commands များကို ရှာရန် အလားတူတစ်ခု တည်ဆောက်ပါ။


Edit this page.

Licensed under CC BY-NC-SA.