Shell နှင့် Script ရေးသားခြင်း

Shell ဆိုသည်မှာ သင်၏ ကွန်ပျူတာကို စာသားဖြင့် ထိရောက်စွာ ခိုင်းစေနိုင်သည့် Interface တစ်ခု ဖြစ်ပါသည်။

Shell prompt ဆိုသည်မှာ Terminal တစ်ခုကို ဖွင့်လိုက်သည့်အခါ သင့်အား ကြိုဆိုသည့် နေရာဖြစ်ပါသည်။ ယင်းက သင့်အား ပရိုဂရမ်များနှင့် Command များကို Run နိုင်စေပါသည်။ အသုံးများသော Command အချို့မှာ-

သို့သော် Shell သည် ထိုမျှမက အဆမတန် ပိုမို ပြုလုပ်နိုင်ပါသည်။ သင့် ကွန်ပျူတာပေါ်ရှိ မည်သည့် ပရိုဂရမ်ကိုမဆို ခေါ်ယူ အသုံးပြုနိုင်ပြီး၊ သင် ပြုလုပ်လိုသမျှ ကိစ္စတိုင်းနီးပါးအတွက် Command-line tool များ ရှိကြပါသည်။ ထို့အပြင် ၎င်းတို့သည် Graphical (GUI) နည်းလမ်းများထက် ပိုမို အလုပ်တွင် မြန်ဆန်လေ့ ရှိကြပါသည်။ ဤသင်ခန်းစာတွင် ယင်း tool အများအပြားကို လေ့လာသွားမည် ဖြစ်ပါသည်။

Shell သည် အပြန်အလှန် တုံ့ပြန်နိုင်သော Programming Language (“scripting”) တစ်ခုကို ပံ့ပိုးပေးပါသည်။ Shell အမျိုးအစားများစွာ ရှိပါသည်-

ဤသင်ခန်းစာတွင် နေရာတိုင်း၌ တွေ့ရှိနိုင်သော sh နှင့် bash ကို အဓိကထားသွားမည် ဖြစ်သော်လည်း အခြား Shell များကိုလည်း စမ်းသပ်ကြည့်နိုင်ပါသည်။ ကျွန်တော်ကတော့ fish ကို ကြိုက်ပါသည်။

Shell programming သည် သင်၏ tool အိတ်ထဲတွင် အလွန် အသုံးဝင်သော tool တစ်ခု ဖြစ်ပါသည်။ ပရိုဂရမ်များကို Prompt တွင် တိုက်ရိုက် ရေးသားနိုင်သကဲ့သို့ ဖိုင်တစ်ခုအတွင်းသို့လည်း ရေးသားနိုင်ပါသည်။ Shell ကို Execute လုပ်နိုင်ရန်အတွက် #!/bin/sh + chmod +x ကို အသုံးပြုပါသည်။

Shell ကို အသုံးပြု၍ အလုပ်လုပ်ခြင်း

Command တစ်ခုကို အကြိမ်များစွာ Run ခြင်း-

for i in $(seq 1 5); do echo hello; done

ဒီနေရာမှာ အသေးစိတ် လေ့လာစရာများစွာ ရှိပါသည်-

Variable များလည်း ရှိကြပါသည်-

for f in $(ls); do echo $f; done

ယင်းက လက်ရှိ Directory ထဲရှိ ဖိုင်အမည် တစ်ခုစီကို ရိုက်နှိပ်ပြသမည် ဖြစ်ပါသည်။ Variable များကို = (Space မပါဘဲ!) အသုံးပြု၍လည်း သတ်မှတ်နိုင်ပါသည်-

foo=bar
echo $foo

“သီးသန့်” Variable အများအပြားလည်း ရှိပါသည်-

Directory များကိုသာ ရိုက်နှိပ်ပြသလိုပါက-

for f in $(ls); do if test -d $f; then echo dir $f; fi; done

ဒီနေရာမှာလည်း အသေးစိတ် လေ့လာစရာများ ပါရှိပါသည်-

ဒါပေမဲ့ ခဏနေပါဦး! ဒါ မှားနေပါတယ်! ဖိုင်အမည်က “My Documents” လို့ ခေါ်ရင် ဘာဖြစ်မလဲ?

Argument များကို ခွဲခြားခြင်း (Argument splitting)

Bash သည် Argument များကို Whitespace (ဟာကွက်) ဖြင့် ခွဲခြားပါသည်။ ဒါဟာ သင် အမြဲတမ်း လိုလားတဲ့ အရာ မဟုတ်နိုင်ပါဘူး!

Globbing (Pattern ဖြင့် ရှာဖွေခြင်း) သည် ယင်း၏ အဖြေဖြစ်ပါသည်။

Whitespace ပြဿနာများက ထိုမျှနှင့် မပြီးဆုံးသေးပါ-

ပေါင်းစပ် အသုံးပြုနိုင်မှု (Composability)

Shell သည် စွမ်းဆောင်ရည် ထက်မြက်ရခြင်း၏ အကြောင်းရင်း အစိတ်အပိုင်းတစ်ခုမှာ ပေါင်းစပ် အသုံးပြုနိုင်မှုကြောင့် ဖြစ်ပါသည်။ အရာအားလုံးကို ပြုလုပ်သည့် ပရိုဂရမ်တစ်ခုတည်း ရှိမည့်အစား ပရိုဂရမ် အများအပြားကို အပြန်အလှန် ချိတ်ဆက် အသုံးပြုနိုင်ပါသည်။

အဓိက သင်္ကေတမှာ | (pipe) ဖြစ်ပါသည်။

သင် စတင်လိုက်သော ပရိုဂရမ်တိုင်း (“processes”) တွင် “stream” သုံးခု ပါရှိကြသည်-

Bash သည် ပရိုဂရမ်များကို ပေါင်းစပ်ရန် အခြား နည်းလမ်းများစွာကိုလည်း ပံ့ပိုးပေးထားပါသည်။

Command များကို (a; b) | tac ဖြင့် အစုဖွဲ့နိုင်ပါသည်- a ကို Run ပြီး ထို့နောက် b ကို Run ကာ ၎င်းတို့၏ Output အားလုံးကို Input များကို ပြောင်းပြန် ရိုက်နှိပ်ပေးသည့် tac ထံ ပို့ဆောင်သည်။

လူသိနည်းသော်လည်း အလွန် အသုံးဝင်သော နည်းလမ်းတစ်ခုမှာ process substitution ဖြစ်ပါသည်။ b <(a) သည် a ကို Run ပြီး ၎င်း၏ Output stream အတွက် ယာယီ ဖိုင်အမည်တစ်ခု ဖန်တီးကာ ထိုဖိုင်အမည်ကို b ထံ ပေးပို့မည် ဖြစ်သည်။ ဥပမာ-

diff <(journalctl -b -1 | head -n20) <(journalctl -b -2 | head -n20)

ယင်းက အရင်ကွန်ပျူတာ ပွင့်ခဲ့စဉ် (boot log) ၏ ပထမ စာကြောင်း ၂၀ နှင့် ယင်းမတိုင်မီက boot log တို့အကြား ကွဲပြားချက်များကို ပြသပေးမည် ဖြစ်ပါသည်။

Job နှင့် Process များကို ထိန်းချုပ်ခြင်း

အချိန်ကြာမြင့်စွာ အလုပ်လုပ်ရမည့် အရာများကို နောက်ကွယ် (background) တွင် Run လိုပါက ဘာလုပ်ရမည်နည်း?

သင့် ကွန်ပျူတာပေါ်တွင် Run နေသော အခြား အရာများအတွက် ဘာလုပ်နိုင်သနည်း?

Flag များ

Command line utility အများစုသည် Parameter များကို flag များ အသုံးပြု၍ ရယူကြသည်။ Flag များသည် အများအားဖြင့် အတိုပုံစံ (-h) နှင့် အရှည်ပုံစံ (--help) ဟူ၍ လာလေ့ရှိသည်။ ပုံမှန်အားဖြင့် CMD -h သို့မဟုတ် man CMD ကို Run ခြင်းက ပရိုဂရမ်က လက်ခံသည့် Flag စာရင်းကို ပေးပါလိမ့်မည်။ Short flag များကို ပေါင်းစပ်နိုင်လေ့ ရှိသည်၊ rm -r -f ကို Run ခြင်းသည် rm -rf သို့မဟုတ် rm -fr ကို Run ခြင်းနှင့် တူညီပါသည်။ အသုံးများသော Flag အချို့သည် စံနှုန်းတစ်ခုကဲ့သို့ ဖြစ်နေပြီး Application အများအပြားတွင် ၎င်းတို့ကို တွေ့ရမည် ဖြစ်သည်-

ထို့အပြင် Double dash -- ကို Built-in command များနှင့် အခြား Command အများအပြားတွင် Command Option များ ပြီးဆုံးကြောင်း ဖော်ပြရန် အသုံးပြုပြီး ယင်းနောက်တွင် Positional parameter များကိုသာ လက်ခံတော့မည် ဖြစ်သည်။ ထို့ကြောင့် သင့်တွင် -v အမည်ရှိ ဖိုင်တစ်ခု ရှိပါက (ဖန်တီးနိုင်ပါသည်) ထိုဖိုင်ကို grep လုပ်လိုလျှင် grep pattern -- -v က အလုပ်လုပ်မည် ဖြစ်ပြီး grep pattern -v က အလုပ်လုပ်မည် မဟုတ်ပါ။ အမှန်တော့ ထိုကဲ့သို့သော ဖိုင်တစ်ခုကို ဖန်တီးသည့် နည်းလမ်းတစ်ခုမှာ touch -- -v ပြုလုပ်ခြင်း ဖြစ်ပါသည်။

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

  1. သင်သည် Shell ကို လုံးဝ အသစ်စတင် အသုံးပြုသူ ဖြစ်ပါက BashGuide ကဲ့သို့သော ပိုမို ပြည့်စုံသည့် လမ်းညွှန်ကို ဖတ်ရှုလိုပေလိမ့်မည်။ အကယ်၍ ပိုမို နက်နဲသော မိတ်ဆက်ကို လိုချင်ပါက The Linux Command Line သည် အရင်းအမြစ် ကောင်းတစ်ခု ဖြစ်ပါသည်။

  2. PATH, which, type

    Command line မှတစ်ဆင့် Run သည့် ပရိုဂရမ်များကို ရှာဖွေရန် PATH environment variable ကို အသုံးပြုကြောင်း အနည်းငယ် ဆွေးနွေးခဲ့ကြပြီး ဖြစ်ပါသည်။ ၎င်းကို အနည်းငယ် ထပ်မံ လေ့လာကြည့်ကြစို့-

    • echo $PATH (သို့မဟုတ် လှပစွာ ပြသရန် echo $PATH | tr -s ':' '\n') ကို Run ပြီး ၎င်း၏ ပါဝင်မှုများကို စစ်ဆေးပါ၊ မည်သည့် တည်နေရာများ စာရင်းပါဝင်သနည်း?
    • which command သည် User PATH အတွင်း၌ ပရိုဂရမ်တစ်ခုကို ရှာဖွေပေးသည်။ echo, ls သို့မဟုတ် mv ကဲ့သို့သော အသုံးများသည့် Command များအတွက် which ကို Run ကြည့်ပါ။ which သည် Shell alias များကို နားမလည်သောကြောင့် အနည်းငယ် ကန့်သတ်ချက် ရှိသည်ကို သတိပြုပါ၊ ထို Command များအတွက် type နှင့် command -v များကို Run ကြည့်ပါ။ Output မည်သို့ ကွဲပြားသနည်း?
    • PATH= ကို Run ပြီး ယခင် Command များကို ထပ်မံ Run ကြည့်ပါ၊ အချို့ အလုပ်လုပ်ပြီး အချို့ အလုပ်မလုပ်ပါ၊ ဘာကြောင့်လဲဆိုတာ သင် ရှာဖွေနိုင်ပါသလား?
  3. သီးသန့် Variable များ
    • ~ variable သည် မည်သို့ ဖြန့်ကားသနည်း? . ကော ဘာလဲ? .. ကော ဘာလဲ?
    • $$? variable က ဘာလုပ်ပေးသနည်း?
    • $_ variable က ဘာလုပ်ပေးသနည်း?
    • !! variable သည် မည်သည့်အရာအဖြစ် ဖြန့်ကားသနည်း? !!* ကော ဘာလဲ? !l ကော ဘာလဲ?
    • ဤ Option များအတွက် Documentation ကို ရှာဖွေပြီး ရင်းနှီးကျွမ်းဝင်အောင် ပြုလုပ်ပါ
  4. xargs

    အချို့အချိန်များတွင် Pipe ပြုလုပ်ခံရသော Command သည် စာကြောင်းအသစ် (newline) ခွဲထားသည့် Format ကို မျှော်လင့်မထားသောကြောင့် Piping သည် အဆင်မပြေဖြစ်တတ်ပါသည်။ ဥပမာ file command သည် ဖိုင်၏ Property များကို ပြသပေးသည်။

    ls | file နှင့် ls | xargs file တို့ကို Run ကြည့်ပါ။ xargs က ဘာလုပ်နေသနည်း?

  5. Shebang

    Script တစ်ခုကို ရေးသားသည့်အခါ shebang စာကြောင်းကို အသုံးပြု၍ Script ကို အဓိပ္ပာယ်ပြန်ဆိုရန် မည်သည့် Interpreter ကို အသုံးပြုရမည်ကို သင်၏ Shell ထံ သတ်မှတ်ပေးနိုင်ပါသည်။ အောက်ပါ ပါဝင်မှုများဖြင့် hello အမည်ရှိ Script တစ်ခုကို ရေးသားပြီး chmod +x hello ဖြင့် Execute လုပ်နိုင်အောင် ပြုလုပ်ပါ။ ထို့နောက် ./hello ဖြင့် Execute လုပ်ပါ။ ထို့နောက် ပထမစာကြောင်းကို ဖျက်ပြီး နောက်တစ်ကြိမ် ထပ်မံ Execute လုပ်ပါ? Shell သည် ထိုပထမစာကြောင်းကို မည်သို့ အသုံးပြုနေသနည်း?

       #! /usr/bin/python
    
       print("Hello World!")
    

    #! usr/bin/env bash ကဲ့သို့သော Shebang ပါဝင်သည့် ပရိုဂရမ်များကို မကြာခဏ တွေ့ရပါလိမ့်မည်။ ဤသည်မှာ ၎င်း၏ ကိုယ်ပိုင် အားသာချက်၊ အားနည်းချက်များ ရှိသည့် ပိုမို Portable ဖြစ်သော ဖြေရှင်းချက် ဖြစ်ပါသည်။ env သည် which နှင့် မည်သို့ ကွဲပြားသနည်း? မည်သည့် ပရိုဂရမ်ကို Run ရမည်ကို ဆုံးဖြတ်ရန် env က မည်သည့် Environment variable ကို အသုံးပြုသနည်း?

  6. Pipes, process substitution, subshell

    အောက်ပါ ပါဝင်မှုများဖြင့် slow_seq.sh အမည်ရှိ Script တစ်ခုကို ဖန်တီးပြီး Execute လုပ်နိုင်ရန် chmod +x slow_seq.sh ပြုလုပ်ပါ။

       #! /usr/bin/env bash
    
       for i in $(seq 1 10); do
               echo $i;
               sleep 1;
       done
    

    Pipe များ (နှင့် Process substitution) သည် Subshell execution သို့မဟုတ် $() အသုံးပြုခြင်းနှင့် ကွဲပြားသည့် နည်းလမ်းတစ်ခု ရှိသည်။ အောက်ပါ Command များကို Run ပြီး ကွဲပြားချက်များကို လေ့လာကြည့်ပါ-

    • ./slow_seq.sh | grep -P "[3-6]"
    • grep -P "[3-6]" <(./slow_seq.sh)
    • echo $(./slow_seq.sh) | grep -P "[3-6]"
  7. အထွေထွေ (Misc)
    • touch {a,b}{a,b} ပြီးလျှင် ls ကို Run ကြည့်ပါ၊ ဘာပေါ်လာသနည်း?
    • အချို့အချိန်များတွင် STDIN ကို ထိန်းသိမ်းထားပြီး ဖိုင်တစ်ခုသို့ Pipe ပို့လိုကြသည်။ echo HELLO | tee hello.txt ကို Run ကြည့်ပါ
    • cat hello.txt > hello.txt ကို Run ကြည့်ပါ၊ ဘာဖြစ်လာမည်ဟု မျှော်လင့်သနည်း? အမှန်တကယ် ဘာဖြစ်သွားသနည်း?
    • echo HELLO > hello.txt ကို Run ပြီး ထို့နောက် echo WORLD >> hello.txt ကို Run ပါ။ hello.txt ၏ ပါဝင်မှုများမှာ မည်သည်တို့ ဖြစ်သနည်း? > သည် >> နှင့် မည်သို့ ကွဲပြားသနည်း?
    • printf "\e[38;5;81mfoo\e[0m\n" ကို Run ပါ။ Output မည်သို့ ကွဲပြားသွားသနည်း? ပိုမို သိရှိလိုပါက ANSI color escape sequences ကို ရှာဖွေပါ။
    • touch a.txt ကို Run ပြီး ထို့နောက် ^txt^log ကို Run ပါ၊ bash က သင့်အတွက် ဘာလုပ်ပေးခဲ့သနည်း? ထိုနည်းတူစွာ fc ကို Run ကြည့်ပါ၊ ၎င်းက ဘာလုပ်ပေးသနည်း?
  8. Keyboard shortcut များ

    မကြာခဏ အသုံးပြုသည့် အခြား Application များကဲ့သို့ပင် Keyboard shortcut များနှင့် ရင်းနှီးအောင် ပြုလုပ်ထားခြင်းသည် အကျိုးရှိလှပါသည်။ အောက်ပါ အရာများကို ရိုက်ထည့်ကြည့်ပြီး ၎င်းတို့ မည်သို့ အလုပ်လုပ်သည်၊ မည်သည့် အခြေအနေများတွင် ၎င်းတို့အကြောင်း သိထားလျှင် အဆင်ပြေနိုင်မည်ကို ရှာဖွေကြည့်ပါ။ အချို့အတွက် အွန်လိုင်းတွင် ရှာဖွေခြင်းက ပိုမို လွယ်ကူနိုင်ပါသည်။ (^X ဆိုသည်မှာ Ctrl+X ကို နှိပ်ခြင်း ဖြစ်သည်ကို သတိရပါ)

    • ^A, ^E
    • ^R
    • ^L
    • ^C, ^\ နှင့် ^D
    • ^U နှင့် ^Y

Edit this page.

Licensed under CC BY-NC-SA.