Shell နှင့် Script ရေးသားခြင်း
Shell ဆိုသည်မှာ သင်၏ ကွန်ပျူတာကို စာသားဖြင့် ထိရောက်စွာ ခိုင်းစေနိုင်သည့် Interface တစ်ခု ဖြစ်ပါသည်။
Shell prompt ဆိုသည်မှာ Terminal တစ်ခုကို ဖွင့်လိုက်သည့်အခါ သင့်အား ကြိုဆိုသည့် နေရာဖြစ်ပါသည်။ ယင်းက သင့်အား ပရိုဂရမ်များနှင့် Command များကို Run နိုင်စေပါသည်။ အသုံးများသော Command အချို့မှာ-
- Directory ပြောင်းလဲရန်
cd - ဖိုင်များနှင့် Directory များကို စာရင်းထုတ်ကြည့်ရန်
ls - ဖိုင်များကို ရွှေ့ပြောင်းရန်နှင့် ကူးယူရန်
mvနှင့်cp
သို့သော် Shell သည် ထိုမျှမက အဆမတန် ပိုမို ပြုလုပ်နိုင်ပါသည်။ သင့် ကွန်ပျူတာပေါ်ရှိ မည်သည့် ပရိုဂရမ်ကိုမဆို ခေါ်ယူ အသုံးပြုနိုင်ပြီး၊ သင် ပြုလုပ်လိုသမျှ ကိစ္စတိုင်းနီးပါးအတွက် Command-line tool များ ရှိကြပါသည်။ ထို့အပြင် ၎င်းတို့သည် Graphical (GUI) နည်းလမ်းများထက် ပိုမို အလုပ်တွင် မြန်ဆန်လေ့ ရှိကြပါသည်။ ဤသင်ခန်းစာတွင် ယင်း tool အများအပြားကို လေ့လာသွားမည် ဖြစ်ပါသည်။
Shell သည် အပြန်အလှန် တုံ့ပြန်နိုင်သော Programming Language (“scripting”) တစ်ခုကို ပံ့ပိုးပေးပါသည်။ Shell အမျိုးအစားများစွာ ရှိပါသည်-
- သင်သည်
shသို့မဟုတ်bashကို အသုံးပြုဖူးပေလိမ့်မည်။ - ပရိုဂရမ်းမင်း ဘာသာစကားများနှင့် စတိုင်တူသော Shell များလည်း ရှိသည်- ဥပမာ
csh။ - သို့မဟုတ် ပိုမို “ကောင်းမွန်သော” Shell များ-
fish,zsh,ksh။
ဤသင်ခန်းစာတွင် နေရာတိုင်း၌ တွေ့ရှိနိုင်သော 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
ဒီနေရာမှာ အသေးစိတ် လေ့လာစရာများစွာ ရှိပါသည်-
for x in list; do BODY; done;သည် Command တစ်ခုကို အဆုံးသတ်ပေးသည် – စာကြောင်းအသစ် (newline) ဖြတ်လိုက်သကဲ့သို့ တူညီသည်listကို ခွဲခြားပြီး၊ တစ်ခုစီကိုxတွင် သတ်မှတ်ကာ body ကို Run သည်- ခွဲခြားခြင်းသည် “whitespace splitting” (ဟာကွက်ဖြင့် ခွဲခြားခြင်း) ဖြစ်ပြီး နောက်တွင် ထပ်မံ ရှင်းပြပါမည်
- Shell တွင် Curly braces ({}) များ မပါရှိသဖြင့်
do+doneကို အသုံးပြုသည်
$(seq 1 5)seqပရိုဂရမ်ကို Argument များဖြစ်သော1နှင့်5ဖြင့် Run သည့် သဘောဖြစ်သည်$()တစ်ခုလုံးကို ထိုပရိုဂရမ်၏ Output ဖြင့် အစားထိုးသည်- အောက်ပါအတိုင်း ရေးသားခြင်းနှင့် တူညီသည်-
for i in 1 2 3 4 5
echo hello- Shell script ထဲရှိ အရာအားလုံးသည် Command များ ဖြစ်ကြသည်
- ဤနေရာတွင် မိမိထံ ပေးပို့လိုက်သော Argument များကို ရိုက်နှိပ်ပြသသည့်
echocommand ကိုhelloဆိုသည့် Argument ဖြင့် Run ခြင်း ဖြစ်သည် - Command အားလုံးကို Colon (:) ဖြင့် ခွဲခြားထားသော
$PATHအတွင်း၌ ရှာဖွေသည်
Variable များလည်း ရှိကြပါသည်-
for f in $(ls); do echo $f; done
ယင်းက လက်ရှိ Directory ထဲရှိ ဖိုင်အမည် တစ်ခုစီကို ရိုက်နှိပ်ပြသမည် ဖြစ်ပါသည်။
Variable များကို = (Space မပါဘဲ!) အသုံးပြု၍လည်း သတ်မှတ်နိုင်ပါသည်-
foo=bar
echo $foo
“သီးသန့်” Variable အများအပြားလည်း ရှိပါသည်-
$1မှ$9: Script ထံ ပေးပို့သော Argument များ$0: Script ၏ အမည်ကိုယ်တိုင်$#: Argument အရေအတွက်$$: လက်ရှိ Shell ၏ Process ID (PID)
Directory များကိုသာ ရိုက်နှိပ်ပြသလိုပါက-
for f in $(ls); do if test -d $f; then echo dir $f; fi; done
ဒီနေရာမှာလည်း အသေးစိတ် လေ့လာစရာများ ပါရှိပါသည်-
if CONDITION; then BODY; fiCONDITIONသည် Command တစ်ခု ဖြစ်ပြီး ယင်းက Exit status 0 (အောင်မြင်မှု) ဖြင့် ပြန်လာပါကBODYကို Run ပေးသည်elseသို့မဟုတ်elifများကိုလည်း ချိတ်ဆက် အသုံးပြုနိုင်သည်- ဤနေရာတွင်လည်း Curly braces မပါရှိသဖြင့်
then+fiကို အသုံးပြုသည်
testသည် ဆန်းစစ်မှုများနှင့် နှိုင်းယှဉ်မှု အမျိုးမျိုးကို ပြုလုပ်ပေးသည့် အခြား ပရိုဂရမ်တစ်ခု ဖြစ်ပြီး မှန်ကန်ပါက 0 ဖြင့် Exit လုပ်သည် ($?)man COMMANDသည် သင့်အတွက် အကူအညီဖြစ်သည်-man test[+]ဖြင့်လည်း ခေါ်ယူ အသုံးပြုနိုင်သည်-[ -d $f ]man testနှင့်which "["ကို ကြည့်ရှုပါ
ဒါပေမဲ့ ခဏနေပါဦး! ဒါ မှားနေပါတယ်! ဖိုင်အမည်က “My Documents” လို့ ခေါ်ရင် ဘာဖြစ်မလဲ?
for f in $(ls)သည်for f in My Documentsအဖြစ် ဖြန့်ကားသွားမည် ဖြစ်သည်- ပထမဦးစွာ
Myကို စစ်ဆေးပြီး၊ ထို့နောက်Documentsကို စစ်ဆေးပါလိမ့်မည် - ဒါဟာ ကျွန်ုပ်တို့ လိုချင်တဲ့ အရာ မဟုတ်ပါဘူး!
- ဒါဟာ Shell script တွေမှာ Bug တွေ ဖြစ်ပေါ်စေတဲ့ အကြီးမားဆုံး အကြောင်းအရင်း ဖြစ်ပါတယ်
Argument များကို ခွဲခြားခြင်း (Argument splitting)
Bash သည် Argument များကို Whitespace (ဟာကွက်) ဖြင့် ခွဲခြားပါသည်။ ဒါဟာ သင် အမြဲတမ်း လိုလားတဲ့ အရာ မဟုတ်နိုင်ပါဘူး!
- Argument ထဲရှိ Space များကို ကိုင်တွယ်ရန် Quoting (မျက်တောင်အဖွင့်အပိတ်) အသုံးပြုဖို့ လိုအပ်သည်၊
for f in "My Documents"ဆိုလျှင် မှန်ကန်စွာ အလုပ်လုပ်မည် ဖြစ်သည် - အခြားနေရာတစ်ခုမှာလည်း ဒီပြဿနာမျိုး ရှိနေသည် – ဘယ်နေရာလဲဆိုတာ မြင်ပါသလား?
test -d $f: အကယ်၍$fတွင် Whitespace ပါဝင်နေပါကtestသည် Error တက်ပါလိမ့်မည်! echoကတော့ Space ဖြင့် ခွဲခြားပြီး ပြန်ပေါင်းပေးတာကြောင့် အဆင်ပြေနေသလို ရှိသော်လည်း ဖိုင်အမည်ထဲတွင် Newline ပါဝင်နေရင် ဘာဖြစ်မလဲ?! Space အဖြစ် ပြောင်းလဲသွားပါလိမ့်မည်!- မခွဲခြားစေလိုသော Variable အသုံးပြုမှု တိုင်းကို Quoting ဖြင့် အုပ်ပေးပါ
- ဒါပေမဲ့ အထက်ပါ ကျွန်ုပ်တို့၏ Script ကို ဘယ်လို ပြင်ကြမလဲ?
for f in "$(ls)"က ဘာလုပ်ပေးမယ်လို့ ထင်ပါသလဲ?
Globbing (Pattern ဖြင့် ရှာဖွေခြင်း) သည် ယင်း၏ အဖြေဖြစ်ပါသည်။
- Bash သည် Pattern များကို အသုံးပြု၍ ဖိုင်များကို မည်သို့ ရှာဖွေရမည်ကို သိရှိသည်-
*မည်သည့် စာလုံးစုမဆို?မည်သည့် စာလုံးတစ်လုံးမဆို{a,b,c}ဤစာလုံးများထဲမှ မည်သည့် စာလုံးမဆို
for f in *: ဤ Directory ထဲရှိ ဖိုင်အားလုံး- Globbing ပြုလုပ်သည့်အခါ ကိုက်ညီသော ဖိုင်တစ်ခုစီသည် သီးခြား Argument တစ်ခု ဖြစ်လာသည်
- သို့သော် အသုံးပြုသည့်အခါ Quoting အုပ်ရန် လိုအပ်ဆဲဖြစ်သည်-
test -d "$f"
- သို့သော် အသုံးပြုသည့်အခါ Quoting အုပ်ရန် လိုအပ်ဆဲဖြစ်သည်-
- ပိုမို အဆင့်မြင့်သော Pattern များကို ဖန်တီးနိုင်သည်-
for f in a*: လက်ရှိ Directory ထဲရှိaဖြင့် စသော ဖိုင်အားလုံးfor f in foo/*.txt:fooထဲရှိ.txtဖိုင်အားလုံးfor f in foo/*/p??.txt:foo၏ Subdirectory များထဲရှိpဖြင့် စသော စာလုံးသုံးလုံးပါ စာသားဖိုင်များအားလုံး
Whitespace ပြဿနာများက ထိုမျှနှင့် မပြီးဆုံးသေးပါ-
if [ $foo = "bar" ]; then– ပြဿနာကို မြင်ပါသလား?- အကယ်၍
$fooက ဗလာဖြစ်နေရင် ဘာဖြစ်မလဲ?[ထံ ပေးပို့သော Argument များသည်=နှင့်barသာ ဖြစ်သွားမည်… - ဤသည်ကို
[ x$foo = "xbar" ]ဖြင့် ဖြေရှင်းနိုင်သော်လည်း သိပ်မကောင်းလှပါ - ယင်းအစား သီးသန့် Parsing ပါဝင်သော Bash built-in comparator ဖြစ်သည့်
[[ကို အသုံးပြုပါ- ထို့အပြင်
-aအစား&&ကိုလည်းကောင်း၊-oအစား||ကိုလည်းကောင်း စသည်ဖြင့် အသုံးပြုခွင့် ပေးသည်
- ထို့အပြင်
ပေါင်းစပ် အသုံးပြုနိုင်မှု (Composability)
Shell သည် စွမ်းဆောင်ရည် ထက်မြက်ရခြင်း၏ အကြောင်းရင်း အစိတ်အပိုင်းတစ်ခုမှာ ပေါင်းစပ် အသုံးပြုနိုင်မှုကြောင့် ဖြစ်ပါသည်။ အရာအားလုံးကို ပြုလုပ်သည့် ပရိုဂရမ်တစ်ခုတည်း ရှိမည့်အစား ပရိုဂရမ် အများအပြားကို အပြန်အလှန် ချိတ်ဆက် အသုံးပြုနိုင်ပါသည်။
အဓိက သင်္ကေတမှာ | (pipe) ဖြစ်ပါသည်။
a | bဆိုသည်မှာaနှင့်bနှစ်ခုလုံးကို Run ပြီး၊a၏ Output အားလုံးကိုb၏ Input အဖြစ် ပို့ဆောင်ကာb၏ Output ကို ရိုက်နှိပ်ပြသခြင်း ဖြစ်သည်
သင် စတင်လိုက်သော ပရိုဂရမ်တိုင်း (“processes”) တွင် “stream” သုံးခု ပါရှိကြသည်-
STDIN: ပရိုဂရမ်က Input ကို ဖတ်ရှုသည့်အခါ ဤနေရာမှ လာသည်STDOUT: ပရိုဂရမ်က တစ်ခုခု ရိုက်နှိပ်ပြသသည့်အခါ ဤနေရာသို့ သွားသည်STDERR: ပရိုဂရမ်က အသုံးပြုရန် ရွေးချယ်နိုင်သော ဒုတိယမြောက် Output ဖြစ်သည်- ပုံမှန်အားဖြင့်
STDINသည် သင်၏ Keyboard ဖြစ်ပြီးSTDOUTနှင့်STDERRနှစ်ခုလုံးသည် သင်၏ Terminal ဖြစ်ကြသည်၊ သို့သော် ယင်းကို ပြောင်းလဲနိုင်ပါသည်!a | bသည်a၏STDOUTကိုb၏STDINအဖြစ် ပြောင်းလဲပေးသည်- အောက်ပါအတိုင်းလည်း ရှိကြသည်-
a > foo(a၏STDOUTသည်fooဖိုင်သို့ သွားသည်)a 2> foo(a၏STDERRသည်fooဖိုင်သို့ သွားသည်)a < foo(a၏STDINကိုfooဖိုင်မှ ဖတ်ရှုသည်)- အကြံပြုချက်-
tail -fသည် ဖိုင်တစ်ခုအတွင်းသို့ ရေးသားနေစဉ် ယင်းဖိုင်ကို ရိုက်နှိပ်ပြသမည် ဖြစ်သည်
- ဒါဟာ ဘာကြောင့် အသုံးဝင်သနည်း? ပရိုဂရမ်တစ်ခု၏ Output ကို စိတ်ကြိုက် ပြုပြင်ပြောင်းလဲနိုင်စေသော ကြောင့်ဖြစ်သည်!
ls | grep foo:fooစကားလုံး ပါဝင်သော ဖိုင်များအားလုံးps | grep foo:fooစကားလုံး ပါဝင်သော Process များအားလုံးjournalctl | grep -i intel | tail -n5: intel စကားလုံးပါသော အဖျားပိုင်း စနစ် Log မက်ဆေ့ချ် ၅ ခု (စာလုံး အသေးအကြီး မခွဲခြားပါ)who | sendmail -t me@example.com: Log in ဝင်ထားသော အသုံးပြုသူ စာရင်းကိုme@example.comသို့ ပေးပို့သည်- နောက်ပိုင်းတွင် ဖော်ပြမည့် Data-wrangling အများအပြားအတွက် အခြေခံ ဖြစ်လာသည်
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 လိုပါက ဘာလုပ်ရမည်နည်း?
&နောက်ဆက်တွဲ သင်္ကေတသည် ပရိုဂရမ်တစ်ခုကို “background” တွင် Run ပေးသည်- ယင်းက သင့်အား Prompt ကို ချက်ချင်း ပြန်လည် ပေးအပ်ပါလိမ့်မည်
- Server နှင့် Client ကဲ့သို့ ပရိုဂရမ် နှစ်ခုကို တစ်ပြိုင်နက်တည်း Run လိုပါက အသုံးဝင်သည်-
server & client - Run နေသော ပရိုဂရမ်သည် သင်၏ Terminal ကို
STDOUTအဖြစ် အသုံးပြုနေဆဲ ဖြစ်သည်ကို သတိပြုပါ!server > server.log & clientကို စမ်းသပ်ကြည့်ပါ
- ထိုသို့သော Process အားလုံးကို
jobsဖြင့် ကြည့်ရှုနိုင်သည်- ယင်းက “Running” ဟု ပြသနေသည်ကို သတိပြုပါ
- ယင်းကို Foreground သို့ ပြန်ယူဆောင်ရန်
fg %JOBကို အသုံးပြုပါ (Argument မပါလျှင် နောက်ဆုံး တစ်ခုဖြစ်သည်) - လက်ရှိ ပရိုဂရမ်ကို Background သို့ ပို့လိုပါက-
^Z+bg(ဤနေရာတွင်^Zဆိုသည်မှာCtrl+Zနှိပ်ခြင်း ဖြစ်သည်)^Zသည် လက်ရှိ Process ကို ရပ်တန့်ပြီး “job” တစ်ခု အဖြစ် ပြုလုပ်ပေးသည်bgသည် နောက်ဆုံး job ကို Background တွင် Run ပေးသည် (&ထည့်ထားသကဲ့သို့)
- Background job များကို လက်ရှိ Session တွင် ချိတ်ဆက်ထားဆဲ ဖြစ်ပြီး Log out ထွက်ပါက ပိတ်သွားမည် ဖြစ်သည်၊
disownသည် ထိုချိတ်ဆက်မှုကို ဖြတ်တောက်ပေးသည် သို့မဟုတ်nohupကို အသုံးပြုနိုင်သည် $!သည် နောက်ဆုံး Background process ၏ PID ဖြစ်သည်
သင့် ကွန်ပျူတာပေါ်တွင် Run နေသော အခြား အရာများအတွက် ဘာလုပ်နိုင်သနည်း?
psသည် သင့်အတွက် အကူအညီ ဖြစ်သည်- Run နေသော Process များကို စာရင်းထုတ်ပေးသည်ps -A: အသုံးပြုသူ အားလုံး၏ Process များကို ပြသသည် (ps axလည်း ရသည်)psတွင် Argument များ စွာ ရှိပါသည်-man psကို ကြည့်ပါ
pgrep: ရှာဖွေခြင်းဖြင့် Process များကို ရှာဖွေပေးသည် (ps -A | grepကဲ့သို့)pgrep -af: Argument များနှင့်တကွ ရှာဖွေပြသသည်
kill: Process အား ID ဖြင့် signal ပေးပို့သည် (ရှာဖွေ၍-fဖြင့် ပေးပို့ရန်pkill)- Signal များသည် Process ကို “တစ်ခုခု ပြုလုပ်ရန်” ခိုင်းစေခြင်း ဖြစ်သည်
- အသုံးအများဆုံးမှာ:
SIGKILL(-9သို့မဟုတ်-KILL): ချက်ချင်း Exit လုပ်ရန် ခိုင်းစေသည် (^\နှင့် တူညီသည်) - ထို့အပြင်
SIGTERM(-15သို့မဟုတ်-TERM): ပုံမှန်အတိုင်း ပြေပြစ်စွာ Exit လုပ်ရန် ခိုင်းစေသည် (^Cနှင့် တူညီသည်)
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 အများအပြားတွင် ၎င်းတို့ကို တွေ့ရမည် ဖြစ်သည်-
-aသည် ပုံမှန်အားဖြင့် ဖိုင်အားလုံးကို ညွှန်းဆိုသည် (ဆိုလိုသည်မှာ Dot (.) ဖြင့် စသော ဖိုင်များ ပါဝင်သည်)-fသည် ပုံမှန်အားဖြင့် တစ်ခုခုကို အတင်းအကျပ် ပြုလုပ်ခြင်း (Force) ကို ညွှန်းဆိုသည်၊ ဥပမာrm -f-hသည် Command အများစုအတွက် အကူအညီ (Help) ကို ပြသပေးသည်-vသည် ပုံမှန်အားဖြင့် အသေးစိတ် Output (Verbose) ကို ပေးသည်-Vသည် ပုံမှန်အားဖြင့် Command ၏ Version ကို ရိုက်နှိပ်ပြသသည်
ထို့အပြင် Double dash -- ကို Built-in command များနှင့် အခြား Command အများအပြားတွင် Command Option များ ပြီးဆုံးကြောင်း ဖော်ပြရန် အသုံးပြုပြီး ယင်းနောက်တွင် Positional parameter များကိုသာ လက်ခံတော့မည် ဖြစ်သည်။ ထို့ကြောင့် သင့်တွင် -v အမည်ရှိ ဖိုင်တစ်ခု ရှိပါက (ဖန်တီးနိုင်ပါသည်) ထိုဖိုင်ကို grep လုပ်လိုလျှင် grep pattern -- -v က အလုပ်လုပ်မည် ဖြစ်ပြီး grep pattern -v က အလုပ်လုပ်မည် မဟုတ်ပါ။ အမှန်တော့ ထိုကဲ့သို့သော ဖိုင်တစ်ခုကို ဖန်တီးသည့် နည်းလမ်းတစ်ခုမှာ touch -- -v ပြုလုပ်ခြင်း ဖြစ်ပါသည်။
လေ့ကျင့်ခန်းများ
-
သင်သည် Shell ကို လုံးဝ အသစ်စတင် အသုံးပြုသူ ဖြစ်ပါက BashGuide ကဲ့သို့သော ပိုမို ပြည့်စုံသည့် လမ်းညွှန်ကို ဖတ်ရှုလိုပေလိမ့်မည်။ အကယ်၍ ပိုမို နက်နဲသော မိတ်ဆက်ကို လိုချင်ပါက The Linux Command Line သည် အရင်းအမြစ် ကောင်းတစ်ခု ဖြစ်ပါသည်။
-
PATH, which, type
Command line မှတစ်ဆင့် Run သည့် ပရိုဂရမ်များကို ရှာဖွေရန်
PATHenvironment variable ကို အသုံးပြုကြောင်း အနည်းငယ် ဆွေးနွေးခဲ့ကြပြီး ဖြစ်ပါသည်။ ၎င်းကို အနည်းငယ် ထပ်မံ လေ့လာကြည့်ကြစို့-echo $PATH(သို့မဟုတ် လှပစွာ ပြသရန်echo $PATH | tr -s ':' '\n') ကို Run ပြီး ၎င်း၏ ပါဝင်မှုများကို စစ်ဆေးပါ၊ မည်သည့် တည်နေရာများ စာရင်းပါဝင်သနည်း?whichcommand သည် User PATH အတွင်း၌ ပရိုဂရမ်တစ်ခုကို ရှာဖွေပေးသည်။echo,lsသို့မဟုတ်mvကဲ့သို့သော အသုံးများသည့် Command များအတွက်whichကို Run ကြည့်ပါ။whichသည် Shell alias များကို နားမလည်သောကြောင့် အနည်းငယ် ကန့်သတ်ချက် ရှိသည်ကို သတိပြုပါ၊ ထို Command များအတွက်typeနှင့်command -vများကို Run ကြည့်ပါ။ Output မည်သို့ ကွဲပြားသနည်း?PATH=ကို Run ပြီး ယခင် Command များကို ထပ်မံ Run ကြည့်ပါ၊ အချို့ အလုပ်လုပ်ပြီး အချို့ အလုပ်မလုပ်ပါ၊ ဘာကြောင့်လဲဆိုတာ သင် ရှာဖွေနိုင်ပါသလား?
- သီးသန့် Variable များ
~variable သည် မည်သို့ ဖြန့်ကားသနည်း?.ကော ဘာလဲ?..ကော ဘာလဲ?$$?variable က ဘာလုပ်ပေးသနည်း?$_variable က ဘာလုပ်ပေးသနည်း?!!variable သည် မည်သည့်အရာအဖြစ် ဖြန့်ကားသနည်း?!!*ကော ဘာလဲ?!lကော ဘာလဲ?- ဤ Option များအတွက် Documentation ကို ရှာဖွေပြီး ရင်းနှီးကျွမ်းဝင်အောင် ပြုလုပ်ပါ
-
xargs
အချို့အချိန်များတွင် Pipe ပြုလုပ်ခံရသော Command သည် စာကြောင်းအသစ် (newline) ခွဲထားသည့် Format ကို မျှော်လင့်မထားသောကြောင့် Piping သည် အဆင်မပြေဖြစ်တတ်ပါသည်။ ဥပမာ
filecommand သည် ဖိုင်၏ Property များကို ပြသပေးသည်။ls | fileနှင့်ls | xargs fileတို့ကို Run ကြည့်ပါ။xargsက ဘာလုပ်နေသနည်း? -
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 ကို အသုံးပြုသနည်း? -
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; donePipe များ (နှင့် 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]"
- အထွေထွေ (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 ကြည့်ပါ၊ ၎င်းက ဘာလုပ်ပေးသနည်း?
-
Keyboard shortcut များ
မကြာခဏ အသုံးပြုသည့် အခြား Application များကဲ့သို့ပင် Keyboard shortcut များနှင့် ရင်းနှီးအောင် ပြုလုပ်ထားခြင်းသည် အကျိုးရှိလှပါသည်။ အောက်ပါ အရာများကို ရိုက်ထည့်ကြည့်ပြီး ၎င်းတို့ မည်သို့ အလုပ်လုပ်သည်၊ မည်သည့် အခြေအနေများတွင် ၎င်းတို့အကြောင်း သိထားလျှင် အဆင်ပြေနိုင်မည်ကို ရှာဖွေကြည့်ပါ။ အချို့အတွက် အွန်လိုင်းတွင် ရှာဖွေခြင်းက ပိုမို လွယ်ကူနိုင်ပါသည်။ (
^Xဆိုသည်မှာCtrl+Xကို နှိပ်ခြင်း ဖြစ်သည်ကို သတိရပါ)^A,^E^R^L^C,^\နှင့်^D^Uနှင့်^Y
Licensed under CC BY-NC-SA.