/* scrip for google analytic */

Ads 468x60px

วันอาทิตย์ที่ 20 กันยายน พ.ศ. 2558

"Writing your first script" วิธีเขียนสคลิป Linux command บทที่ 2

ระดับผู้อ่าน : ความรู้ด้านคอมพิวเตอร์ *น้อย-ปานกลาง 
หมายเหตุ : ให้ลองทำตามไปด้วยในบางส่วน
"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

แต่ละ path มีหน้าที่ในการเก็บ script ที่แตกต่างกันอยู่ เรียกว่าระบบ Filesystem Hierarchy Standard (FHS)

/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

 
 
Blogger Templates