RHCSA แบบไทยๆ 01- Understand Linux Shell

Panupong Simto
4 min readOct 25, 2018

--

Shell ของระบบปฏิบัติการ คือ ส่วนที่ไว้ติดต่อกับผู้ใช้ หลักๆมี 2 แบบคือ

  • Graphic Shell ก็พวกใช้เมาส์คลิก เป็นภาพหน้าต่าง ที่เราคุ้นเคยกันอยู่ทุกวัน ทั้ง Windows และ Linux
  • Command Line Shell ก็พวกใช้การพิมพ์คำสั่ง Commane Line (CLI) เข้าไป ในหลายๆระบบ CLI ก็อยู่ภายใต้ Graphic Shell เหมือนกัน แปลว่า เราไม่จำเป็นต้องติดตั้ง Graphic Shell ก็ได้

จริงๆใน Linux มี CLI Shell หลายตัว แต่ใน RHCSA ผมจะพูดถึง bash เป็นหลัก

bash คือ cli shell ใน Linux ที่ได้รับความนิยมสูงสุด มีแทบในทุก Distribution คุณลักษณะของ Bash จะมีดังนี้

Bash คือ sh-compatible shell (คร่าวๆคือ เป็นการพัฒนาเชลให้มากขึ้นและยังรองรับเชลแบบเก่าๆ) และนำฟีเจอร์ที่น่าสนใจของ Shell ตัวอื่น เช่น Korn shell , C shell มารวมไว้ด้วย ในภาพใหญ่ๆ ตัว Bash ถูกวางวัตถุประสงค์ให้สอดคล้องกับมาตรฐาน IEEE POSIX P1003.2/ISO 9945.2 โดยมันเพิ่มความสามารถทางด้านโปรแกรมมิ่งไว้มากมาย จนถึงอำนวยความสะดวกให้ผู้ใช้เขียนสคริปต์ใช้เองได้อย่างสะดวกรวดเร็ว

การเขียน Bash Script ก็คือการนำคำสั่ง Linux Command Line ต่างๆมารวมๆยำๆกันตามที่เราต้องการให้โปรแกรมมันเป็นไป รวมถึงใช้ความสามารถของ Shell ในการให้โปรแกรมรัน ตามต้องการ

แต่ใน blog นี้เราจะไม่ไปไกลถึงขนาดเขียน Shell Script ขนาดนั้น

เราจะมาพูดถึงพื้นฐานก่อน เมื่อเรามี Linux อยู่ตัวนึงและมี Shell Prompt อยู่ เราต้องรู้คำสั่งและรู้วิธี Interact กับมัน ตัวอย่าง Linux CentOS ที่ผมทำไว้มี Shell เป็นแบบ CLI ไม่มีกราฟฟิก ผมเอาภาพให้ดูแบบนี้ครับ

คำสั่งที่ผมพิมพ์ในภาพก็คือ

uname -a

ผมขออธิบายแบบนี้ครับ

uname คือคำสั่ง (command) เพื่อบอก Shell ให้รู้ว่าเราต้องการจะทำอะไรกับเครื่องหรือระบบปฏิบัติการ ซึ่งมันก็คือโปรแกรมๆนึงนั่นเอง

เครื่องหมาย ขีด -(หรือภาษาอังกฤษใน Linux จะเรียกว่า Single Dash) แล้วตามด้วยตัวอักษรภาษาอังกฤษ 1 ตัว ในที่นี้คือ a นั้นหมายถึง Option (ออพชั่น) แปลว่าพิมพ์คำสั่งโดยมี option เป็น -a คำว่า option หมายถึง “ทางเลือก” ซึ่งเราก็ไม่จำเป็นต้องใช้ option ก็ได้ เพราะมันคือทางเลือก

เช่นนั้นแล้ว เราสามารถพิมพ์คำสั่งบอก Shell ไปตรงๆโดยไม่มี option ก็ได้ คือ

uname

ผลที่ได้ก็จะต่างกัน

สาเหตุเป็นเพราะ

Shell อำนวยความสะดวกให้เราเลือกสั่งโปรแกรมต่างๆได้ ว่าจะให้แสดงผลอะไรบ้าง ทำงานยังไงบ้าง เพราะโปรแกรม โปรแกรมเดียวไม่สามารถทำทุกอย่างได้ถูกต้องตามใจเรา คนเขียนโปรแกรมส่วนใหญ่จึงออกแบบ ทางเลือก (option) เอาไว้ให้เราทำการ Input สั่งเข้ามา ลองย้อนไปดูความแตกต่างว่าการมี -a กับไม่มี ต่างกันยังไง

การใส่ option ก็ยังแบ่งออกได้อีกหลายแบบเช่น

tar -xvf

คือคำสั่ง tar แต่ ขีดครั้งเดียว ใช้ 3 ตัวอักษรเป็น option

หรืออันต่อมา เปลี่ยนจาก a เป็น all

แล้วใช้เป็นสองขีด (Double Dash) เป็นการระบุข้อความภาษาอังกฤษที่สื่อสารได้ง่าย เหมาะสำหรับคนที่อยากรู้ความหมายของมันจริงๆ แต่คน Linux ไม่ค่อยนิยมเต็มๆแบบนี้ เพราะต้องพิมพ์เยอะ และ option Single Dash ก็จะ “เหมือนรู้กันในกลุ่มโปรแกรมเมอร์” ว่า ตัวย่อตัวเดียวก็สื่อได้แล้ว option พวกนี้ในหลายพันหลายหมื่นโปรแกรม ก็มักจะมีคำเต็มคล้ายๆกันบ้าง เช่น

ถ้าใส่ -v ก็คือ version เพื่อดูว่าโปรแกรมเวอร์ชั่นอะไร

ถ้าใส่ -h คือ help เพื่ออธิบายว่าโปรแกรมคืออะไร ทำงานยังไง (เหมือน man page)

ถ้าใส่ -a คือ all คือทั้งหมด

เป็นต้น

อันนี้ไม่เสมอไปนะ โปรแกรมแต่ละโปรแกรมก็มีจุดประสงค์ต่างกัน -v ของโปรแกรมนี้ ก็อาจจะไม่เหมือนกับ -v ของโปรแกรมนึงครับ

ใน RHCSA ในช่วงแรกก็จะโฟกัสแค่นี้ คือรู้คำสั่ง และรู้ option ยังไม่ Advance ไปถึง Shell Script ซับซ้อนอะไร เพราะจุดประสงค์ของ RHCSA คือต้องการให้ผู้สอบได้ดูแลระบบ “ได้” ส่วนระดับที่สูงกว่า RHCSA ก็ “นอกจากจะดูแลระบบได้แล้วต้องปรับแต่งระบบและแก้ไขปัญหาซับซ้อน ได้”

เพราะเหตุนี้เราจึงไม่ลึกมากกับเรื่อง Bash แต่ก็ยังมีอีกอันคือ RHCSA บอกว่านอกจากต้องใช้คำสั่งบน Shell ให้คล่องแคล่วแล้ว ยังต้อง เข้าใจการใช้ redirection เช่นพวก (>, >>, |, 2>, etc.)

ขออธิบายตรงนี้เลยครับ

การใช้ > ตัวอย่างดังนี้

ls > cmd1.txt

เราจะแบ่งเป็น 2 ส่วนคือ ก่อน > และหลัง >

ตัว > นั้นหมายถึง ให้ทำการส่ง output จากคำสั่งแรกไปยังไฟล์ที่กำหนด ในที่นี้คือ output จากคำสั่ง ls เขียนไปในไฟล์ชื่อ cmd1.txt และเป็นแบบเขียนทับเลย หากไฟล์นั้นมีข้อมูลอยู่แล้วจะเขียนทับไปเลยทันที

ls ก็คือคำสั่ง ลิสรายการไฟล์ใน Directory ปัจจุบัน ว่ามีอะไรอยู่ในนี้บ้าง เมื่อเราพิมพ์ ls แล้ว enter ในตอนปกติผลของ ls ก็จะโชว์รายการไฟล์ออกมา นั่นมันก็คือ Output ของโปรแกรม ls เราเรียกอีกอย่างว่า Standard Output to Screen (1)

และเครื่องหมาย > มีหน้าที่ ส่งต่อ output นั้นลงมายังไฟล์ชื่อ cmd1.txt นั่นเอง

ต่อมา ตัว >>

หมายถึง ให้ทำการส่ง output จากคำสั่งแรกไปยังไฟล์ที่กำหนด ในที่นี้คือ output จากคำสั่ง ls เขียนไปในไฟล์ชื่อ cmd1.txt แต่เป็นแบบ เขียนเพิ่มจากข้อความสุดท้ายของไฟล์นั้น (Append)

ต่อมา ตัว | หรือเรียกว่า ไปป์ (pipe)

หมายถึง ส่งค่า output ของคำสั่งที่ 1 ให้คำสั่งที่ 2 ประมวลผล เช่น

man top | grep zombie

อธิบายว่า เราพิมพ์คำสั่ง man เพื่อจะดูคู่มือ (manual) ของโปรแกรม top

แล้วเรากำหนดไปป์ | ว่าให้ grep zombie นั่นหมายความว่า output ของบรรทัดนี้ จะถูกค้นหามาเฉพาะข้อความที่มีคำว่า zombie เท่านั้น อารมณ์คล้ายๆการ filter ตอน search หาอะไรบางอย่างนั่นแหละครับ

เดี๋ยวไม่เห็นภาพ อะ สมมติ สั่ง man top ธรรมดา จะเกิดอะไรขึ้น

ก็จะเห็น คู่มือของโปรแกรม top เต็มเพียบ (top คือโปรแกรมที่ใช้ดูว่า เครื่อง linux ของเรามี process อะไรอยู่บ้าง อารมณ์เหมือน task manager ของ Windows) แต่พอดีเราขี้เกียจอ่าน เราอยากรู้เฉพาะ zombie เท่านั้น ขอให้ตัดออกมาเฉพาะ zombie ได้มั้ย ? ได้ ก็ใช้ grep zombie ต่อท้าย pipe แบบนี้

zombie คือรูปแบบ process ของโปรแกรมแบบนึงของ Linux จะเห็นในภาพว่ามี running , sleeping , stopped , zombie เราจะไว้ว่ากันทีหลัง เอา grep ก่อน

มันก็จะโผล่มาแค่เนี้ย 2 บรรทัดที่มีคำว่า zombie จาก output ของคำสั่ง man top แค่นั้น ซึ่งเราสามารถประยุกต์ output แบบอื่นๆได้ (จะมีไอเดียเยอะขึ้นถ้าเรารู้คำสั่ง linux เยอะๆ แต่ไม่อยากให้จำครับ อยากให้ทยอยเข้าใจไปเรื่อยๆ)

ตัว | เนี่ยมันจะต่างจาก > , >> ตรงที่ว่า

> , >> จะส่ง output จากคำสั่งไปยังไฟล์ใช่มั้ยครับ

แต่ส่วน | ตัวนี้จะส่ง output ไปยังอีกโปรแกรมนึงให้ประมวลผล คือ screen output เลย ไม่ใช่ output ไปที่ file และไม่จำเป็นต้องเป็นคำสั่ง grep เสมอไป มันขึ้นอยู่กับเราว่าใช้งานหลากหลายและบ่อยแค่ไหน ใช้บ่อยๆก็จะเข้าใจและประยุกต์ต่อได้ครับ

Tips: Screen Output ก็คือการ process ณ เดี๋ยวนั้น ส่วน File Output ก็เก็บเป็นไฟล์ ปิดคอมเปิดใหม่ไฟล์ก็ยังอยู่ ลองพิจารณาเลือกใช้ให้เหมาะครับ

แล้ว 2> ละ ?

ก่อนจะอธิบาย 2> ขออธิบาย 0,1 ก่อน

0 คือ Standard Input ที่มาจาก Keyboard , stdin

1 คือ Standard Output ที่มาจากหน้าจอ (Screen) , stdout

2 คือ Standard Error ที่มาจากหน้าจอ (Screen) , stderr

เพราะฉะนั้น 2> ก็หมายถึง หากใช้คำสั่งแล้วเจอ error อะไรก็ให้ส่งไปยังไฟล์ต่อไป

ตัวอย่าง ตอนนี้ผมอยู่ที่ /etc

ผมจะพิมพ์คำสั่ง

touch new1.txt 2> /home/panupong/cmd1.txt

จะเห็นว่าผมสามารถพิมพ์ได้จบ ไม่มีปัญหาอะไร อธิบายคำสั่งแบบนี้ครับ

pwd คือ Print Working Directory เป็นคำสั่งให้โชว์ว่าตอนนี้ผมอยู่ที่ Directory อะไร Screen output ก็บอกว่าผมอยู่ที่ /etc

touch new1.txt หมายถึง สร้างไฟล์ (คำสั่ง touch คือการสร้างไฟล์ขึ้นมา) ชื่อไฟล์ว่า new1.txt ใน Directory ปัจจุบันที่ผมอยู่นี้ ก็คือ etc

2> หมายความว่า หากคำสั่ง touch new1.txt มี erro อะไร ให้เก็บไว้ที่ไฟล์ /home/panupong/cmd1.txt

ทีนี้ จากการที่ผมสร้างไฟล์ new1.txt ขึ้นมาใน Directory ชื่อ /etc ผมต้องมาดูว่า มีไฟล์นี้จริงมั้ยโดยการพิมพ์คำสั่ง

ls | grep new1

ปรากฎว่าไม่มีอะไรเกิดขึ้น

แปลว่า ไม่มีไฟล์ new1 ถูกสร้างขึ้นใน Directory /etc นั่นเอง แสดงว่าการสร้างไม่สำเร็จ และคงเกิด error ขึ้น แต่ด้วยความที่เราทำ 2> ไว้แล้ว ว่า error อะไรให้ออกไปที่ไฟล์ไหนใช่มั้ยครับ เราก็จะกลับไปดูไฟล์นั้นกันว่า มี error อยู่จริงมั้ย

ผมย้อนกลับไปที่ Directory ชื่อ /home/panupong เพราะผมสร้างไฟล์ cmd1.txt ไว้ที่นี่

ผมใช้คำสั่ง cat เพื่อดูว่า ในไฟล์มีข้อความอะไรบ้าง คำสั่ง cat คือคำสั่งเปิดไฟล์ข้อความธรรมดา

ซึ่งปรากฎว่า มี error อยู่ในไฟล์นี้จริงๆ error นั้นก็คือ

touch: cannot touch ‘new1.txt’: Permission denied

คำสั่ง touch ที่ผมพยายามสร้างไฟล์ new1.txt ใน Directory /etc นั้นไม่สามารถทำได้ เพราะถูกปฏิเสธ permission

ก็คือผมรู้อยู่แล้วว่าผมไม่สามารถสร้างไฟล์ใน Directory /etc ได้ สิทธิ์ผมเป็นแค่ user ธรรมดา Directory /etc นี้จะป้องกันไม่ให้เขียนได้ เอาเป็นว่าผมรู้แน่ๆว่ามันจะ error

ผมก็เลยทำตัวอย่างให้เห็นว่า error ที่จะออกมา เราสามารถเก็บมันได้เข้าไปในไฟล์โดยใช้ 2> นะ แบบนี้แหละครับ

เหมาะสำหรับเวลาเราจะตรวจสอบอะไรแล้วประเมินว่ามันน่าจะมี error ก็เก็บเข้าไฟล์ไว้มาตรวจสอบทีหลังได้

สำหรับ blog นี้ยาวมากแล้ว ไว้ต่อกันใหม่ blog หน้านะครับ

--

--

No responses yet