หมายเหตุ : ให้ลองทำตามไปด้วยในบางส่วน
"Writing your first script" วิธีเขียนสคลิป Linux command บทที่ 1
สวัสดีครับ บทความนี้เพื่อเป็นการแชร์ประสบการณ์ที่เคยศึกษา และรวบรวมข้อมูลการเขียนสคลิปนำมาบันทึกเอาไว้ทบทวนเวลาลืมคำสั่งหรือเทคนิคไปนะครับ
โดยศึกษาจากเว็บไซต์ต่างประเทศต่างๆรวบรวมเอาไว้ ส่วนmainหลักเว็บไซต์ที่จะเอามาเขียน ก็จะเอาเว็บไซต์ linuxcommand เอามาเป็นหลักเพราะผมรู้สึกว่า อ่านเว็บไซต์นี้แล้ว ค่อนข้างนำคำสั่งที่จำเป็นและใช้บ่อยมาสอน ส่วนถ้าเป็น Tip เล็กๆน้อยๆต่างๆก็จะอ้างอิงเอาไว้ให้ผู้ที่สนใจ ติดตามกันไปถ้าอยากศึกษาใน เวอร์ชั่นอังกฤษ
เรามาคุยกันต่อจากบทที่ 1 กันครับ
ร่วมสนับสนุนนักเขียนด้วยการคลิ๊กลิ้ง ด้านล่าง ขอบคุณครับ รับรองไม่มีไวรัส
จากบทที่1 ที่ผ่านมาได้เรียนรู้วิธีสร้าง file เขียน script แล้วตั้ง permission ให้สามารถรันผ่านคำสั่ง ./ ได้โดยปกติ จะนำสคลิปใส่เข้าไปใน folder Bin (binary) หน้าจอ shell ก็จะสามารถอ่าน script นั้นๆได้ โดยไม่จำเป็นต้องใส่คำสั่ง ./
ซึ่งจะสมมติว่า ถ้าเรามีสคลิปที่เราเขียนเองหรือโปรแกรมที่จำเป็นจะต้องติดตั้ง ทำให้ไม่สามารถที่จะใส่สคลิปเข้าไปรวมกับ Folder Bin ได้ จึงจำเป็นต้องสร้าง folder ขึ้นมาเพื่อเก็บสคลิปนั้นๆ ดังนั้นเมื่อสร้าง Folder ใหม่แล้ว เราก็ไม่สามารถรันสคลิปได้โดย ไม่ต้องใส่ ./ นะสิ งั้นทำอย่างไร จริงๆแล้วมันมีวิธีทำครับ
สร้าง Path Directory Environment
ก็คือสร้างให้ bash รับรู้ว่า Folder ที่เก็บไฟล์ script นั้นเป็น environment ของ bash แล้วนะ script ที่อยู่ในFolder ที่ตั้งค่าเอาไว้ สามารถรัน script ได้ทันที โดยไม่ต้องใช้ ./ แต่มีเงื่อนในการตั้งค่านี้ คือ ยังไม่สามารถบันทึกได้อย่างถาวร เพราะไม่ได้เขียนลงบนไฟล์ initial หรือเรียกว่า startup file เมื่อปิด shell ใน session นี้ไป Path ที่ตั้งไว้ก็จะหายไปทันที จะอธิบายในหัวข้อถัดไป ดูตัวอย่างต่อไปนี้ก่อน
ตัวอย่าง script
#!/bin/bash #systeminfo_page ###constants TITLE="System Information for $HOSTNAME" RIGHT_NOW=$(date +="%x %r %z") TIME_STAMP="Updateed on $RIGHT_NOW by $USER" ###Function system_info(){ # temporary function stub echo "function system_info" } drive_space(){ #temporary function stub echo "function drive_space" } home_space(){ #temporary function stub echo "function home_space" } show_uptime(){ #temporary function stub echo "function show_uptime" } ###Main cat <<- data-blogger-escaped-__eof__="" data-blogger-escaped-html="">เมื่อได้ตัวอย่างไฟล์แล้วเก็บไว้ก่อน ดำเนินการตามรูปภาพด้านล่าง อธิบายตามลำดับ$TITLE __EOF__
อธิบายขั้นตอนการทำงาน
Step #1 ใช้ Echo ตัวแปร $PATH เพื่อแสดง environment ออกมาจะเห็นว่ามี /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin โดยมี โคลอนกันเอาไว้ระหว่าง path อื่นๆ
Step #2 ใช้คำสั่ง ls เพื่อดู Folder
Step #3 สร้าง Directory ชื่อ lesson_script2
Step #4 ใช้คำสั่ง Export สร้างตัวแปร PATH = $PATH:~/lesson2_script2 (~ คือ เครื่องหมายย่อ path)
Step #5 ทำการ Echo อีกครั้งจะเห็นว่า pathที่ได้นั้นยาวขึ้นโดยมี /root/lesson2_script2 มาต่อท้าย (จากเครื่องหมาย ~ ได้ /root มาเพราะ Folder lesson2_script2 อยู่ใน Folder root นั้นเอง
Step #6 เข้าไปยัง Folder lesson2_script2
Step #7 เปิดดูไฟล์ script ในบรรทัดถัดมา ก็สามารถทำการรันได้ทันที ก็จะเห็น เอาต์พุตที่สร้างเอาไว้ จากที่ได้กล่าวไว้ว่า ถ้า ปิด session นี้แล้ว pathจะหาย ก็ผู้ที่สนใจแล้วไม่เชื่อ ลองทำตามผู้เขียนดูแล้วทดสอบดูครับ แล้วจะเข้าใจ ดังนั้นวิธีแก้ไขก็คือ แก้ไข ไฟล์เริ่มต้น StartUp file จะถูกแบ่งเป็นสอง กลุ่ม โดยแบ่งเป็น non-login shell และ login shell นั้นเอง ได้แก่
Login shell
Login shell เมื่อทำการตั้งค่าในไฟล์ของ Log in ด้านล่างนี้ เมื่อมีสถานะเป็น root โดยใช้คำสั่ง /bin/su โดยมีไฟล์ดังนี้
1. /etc/profile
2. ~/.bash_profile
3. ~/.bash_login
4. ~/.profile
Non - Login shell
Non - Login shell เมื่อทำการตั้งค่าใน ไฟล์ของ non-Log in ด้านล่างนี้ ให้นึกถึงตอนที่เป็นสถานะ unroot หรือ user ทั่วไป
1 /etc/bash.bashrc
2. ~/.bashrc
Life Cycle
1. เมื่อเปิดโปรแกรม shell ขึ้นมา ตัว shell นี้จะทำการอ่าน script เริ่มต้นต่างๆ ขึ้นอยู่กับกรณี ถ้าเข้า shell แบบ Login มันก็จะเข้าไปอ่านไฟล์ /etc/profile ตามด้วย ~/.bash_profile(ถ้ามี ถ้าไม่มีก็จะไปอ่าน ~/.profile ), ~/.bash_login และ ~/.profile ตามลำดับ มันจะทำงานก็ต่อเมื่อพบเจอไฟล์ ตามลำดับนี้เอง แล้วถ้าปิด session นั้นไป มันก็จะเข้าไปอ่าน ไฟล์ ~/.bash_logout (ถ้ามี)
2. แต่ถ้าเรียก bash shell ออกมาโดยไม่ได้ Login มันก็จะไปอ่านไฟล์ ~/.bashrc ถ้ามี สามารถสั่งไม่ให้รันได้ด้วยออปชัน --norc และสั่งให้รันจากไฟล์ที่กำหนดด้วยออปชัน --rcfile
ดังนั้นเวลาต้องการรันได้ในทุกกรณี ก็ควรจะใส่คำสั่ง
PATH = $PATH:~/lesson2_script2/script2
ในทุกๆไฟล์ แล้วสร้างไว้ที่ /home หรือ /root
tip&trick
ในระบบ unix หรือ linux เวลาที่เริ่มอ่านไฟล์ แล้วหากเจอ ไฟล์ที่มี dot อยู่หน้าชื่อ จะเรียกว่า DOTFILE ซึ่งเป็นไฟล์ที่ซ่อนเอาไว้ไม่ให้สามารถมองเห็น แต่ shell สามารถอ่านเจอ ก็อย่างเช่น ไฟล์ .bash_profile , .bash_login , .bashrc เป็นต้น
ในไฟล์แต่ละ ไฟล์นี้จำเป็นจะต้อง สร้างเอาไว้ Path $Home ของRoot นะครับ
เมื่อแก้ไขไฟล์เสร็จแล้ว หลังจากนั้นต้อง Restart ครับ ไม่เช่นนั้นจะไม่สามารถรันไฟล์ที่แก้ไขได้
จากที่ได้กล่าวไว้จากบทที่ 1 แล้วว่าเมื่อ echo ออกมาแล้วจะเห็น Path อยู่ 6 รูปแบบ ได้แก่
1. /sbin
2. /bin
3. /usr/sbin
4. /usr/bin
5. /usr/local/sbin
6. /usr/local/bin
/bin
เป็นที่เก็บ script ที่มีคำสั่งเบื้องต้น เช่น ls ,cat ,cd User ทุกคนสามารถใช้คำสั่งในนี้ได้
/sbin
เหมือนกับ bin แต่ script จะใช้ได้แต่ Root ที่มีสิทธิ์ในการเข้าถึงเท่านั้น
/usr/bin
เป็น script ที่อยู่ไม่สามารถใช้ได้กับยูสเซอร์ทั่วไปแต่ แต่ตั้งไว้เป็นเฉพาะกลุ่ม
/usr/sbin
เหมือนกับ /usr/sbin แต่ใช้ได้แต่กับ Root ที่มีสิทธิ์ในการเข้าถึงเท่านั้น
/usr/local/bin และ /usr/local/sbin
คล้ายกับ path ที่ผ่านมาแต่ จะใช้เพียง เครื่องที่ติดตั้งนี้ (Host) เท่านั้น
ขอบคุณที่ติดตามอ่านครับ จบแล้วครับ โปรดติดตาม ในบทถัดไป
THE END
ร่วมสนับสนุนนักเขียนด้วยการคลิ๊กลิ้ง ด้านล่าง ขอบคุณครับ รับรองไม่มีไวรัส
Credit Picture
- stevennoble.com
- prismnet.com
Reference
http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/profile.html
https://th.wikipedia.org/wiki/%E0%B9%81%E0%B8%9A%E0%B8%8A
https://code.google.com/p/system-programming-c…/…/IntroShell
http://unix.stackexchange.com/…/difference-between-login-sh…
http://it-madmonster.blogspot.com/…/unix-linux-bourne-shell…
http://linux.thai.net/…/thailinux/docs/LTP/02_721shell1.html
http://www.coziplace.com/archives/35192
http://www.gnu.org/software/bash/manual/bashref.html#index-startup-files
http://askubuntu.com/questions/308045/differences-between-bin-sbin-usr-bin-usr-sbin-usr-local-bin-usr-local
https://gist.github.com/itbakery/7ffcccec9ca0ad908bb3
https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard