Tutorial

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

By Arnon Puitrakul - 23 กุมภาพันธ์ 2022 - 2 min read min(s)

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

การใช้งาน Command Line น่าจะเป็นเรื่องพื้นฐานของ Developer หรือกระทั่งคนที่ใช้งานโปรแกรมบางอย่างโดยเฉพาะเลยละ เพราะมันทำให้เราสามารถควบคุม การตั้งค่า และการทำงานของโปรแกรมเราได้มหัศจรรย์อย่างไม่น่าเชื่อเลยทีเดียว (นึกว่าขายตรง) วันนี้เราจะพามาทำความรู้จักกับ การทำงานของ Command Line และ คำสั่งพื้นฐานของ Linux Shell กัน

ปล. Windows Shell กับ Linux Shell (บน macOS ใช้ได้เหมือนกันเลยเด้อ) ไม่เหมือนกันในหลาย ๆ คำสั่งนะ ดังนั้น ถ้าใครใช้ Windows เป็นส่วนใหญ่พวก Part คำสั่งจะไม่เหมือนกัน สำหรับเรา แนะนำให้เรียนรู้ Linux ไว้จะดีมาก เพราะทั้งโลกเขาใช้กัน

Command Line คืออะไร ?

เราเริ่มจากคำถามก่อนเลยละกันสำหรับคนที่อาจจะยังไม่คุ้นเคยกับการใช้งาน Command Line เราขอเล่าเรื่องสั้น ๆ ก่อนละกัน

Command Line พื้นฐานที่ Developer ควรรู้

ปกติเวลาเราใช้งานเครื่องคอมพิวเตอร์ในสมัยนี้อะนะ ส่วนใหญ่ เราจะใช้งานผ่านสิ่งที่เรียกว่า GUI หรือ Graphic User Interface หรือหน้าตาของโปรแกรมที่เราสามารถคลิก ๆ ได้อย่างที่เราเห็นเลย ทำให้เราสามารถ เอาเมาส์คลิกเพื่อเลือกเมนู และการตั้งค่าต่าง ๆ ได้อย่างง่าย ๆ เลย ซึ่งแน่นอนว่า พวกนี้ มันจะไปเหมาะกับการทำงานที่ซ้ำ ๆ และ ไม่ได้ต้องจำคำสั่งอะไรให้ยุ่งยากเลย แค่เราหาตัวเลือก หรือเมนูที่เราอยู่บนหน้าจอ เราก็ทำงานกับมันได้แล้ว เมื่อก่อน ตอนที่มี GUI ของเครื่องคอมพิวเตอร์ออกมาใหม่ ๆ อย่าง Xeox ตอนนั้น เราว่าคนน่าจะว้าวแหละ จากเดิมที่ต้องจำคำสั่งอะไรไม่รู้ ก็กด ๆ หาได้เลย

แต่การใช้ GUI ก็มีปัญหาบางเรื่อง เพราะการจะเอาตัวเลือกที่ไม่ได้ใช้งานบ่อย ๆ มาใส่ให้เรากดแล้วทำให้ใช้งานง่าย เป็นเรื่องที่น่าปวดหัว ไหนจะเป็นเรื่องของ Cost ในการ Implement GUI ก็ใช้ Cost เยอะพอสมควร กับการใช้ Resource ต่าง ๆ ก็เยอะกว่าด้วย ทำให้ในงานบางประเภท การใช้ Command Line ก็ยัง Practical กว่ามาก ๆ

ทำให้ Command Line จริง ๆ ก็คือ การเข้าถึง และ ใช้งานโปรแกรมผ่านพวกข้อความคำสั่งต่าง ๆ โดยตรง เรียกว่าเป็น User Interface แบบนึงละกัน แต่แทนที่จะมี Graphic สวยงาม ก็จะเป็นพวกข้อความให้เราพิมพ์

How command line works?

เหมือนกับโปรแกรมที่เราใช้งานผ่าน GUI ทั่ว ๆ ไปเลย การที่เราจะใช้งานโปรแกรมได้ เราจะต้องเปิดโปรแกรมขึ้นมาก่อน แล้วพวก Command Line ละ มันทำยังไง เรามาดูกันดีกว่าว่า พวก Command Line ที่เราพูดถึงกัน มันทำงานอย่างไร

Shell Components

โดยทั่วไปแล้ว เวลาเครื่องคอมพิวเตอร์สมัยนี้ทำงานกัน มันก็จะมีตัวเครื่องที่เป็น Physical จริง ๆ เลย จากนั้น เราจะทำการลง OS ลงไปเพื่อเป็นโปรแกรมสำหรับควบคุมเครื่อง Physical ให้ทำงานได้แบบที่เราต้องการโดยไม่ต้องมานั่งโปรแกรมเอง 100% ปกติแล้ว OS จริง ๆ มันไม่ได้มี Interface เพื่อติดต่อกับเราเลย ปกติมันเหมือนเป็นใบ้เลย ไม่สามารถพูดคุย กับเราได้เลย หรือกลับกัน เราบอกให้มันทำอะไรไม่ได้ แล้วทำยังไงดีละ เราก็ต้องมาสร้างสิ่งที่เหมือนกับสะพาน หรืออะไรบางอย่างที่ทำให้เรา คือ User สามารถคุยกับ OS ได้ โปรแกรมพวกนั้นเราเรียกว่า Shell

Shell เป็นโปรแกรมประเภทหนึ่งที่ออกแบบมาเพื่อเป็น Interface ระหว่าง User และ OS ได้โดยตรงเลย จริง ๆ นึกง่าย ๆ ว่า Shell ทำงานตามชื่อเลยคือ การหุ้ม OS เอาไว้ ถ้าเราจะคุยกับ OS เราก็สามารถทำผ่าน Shell ได้

อย่างที่บอกว่า Shell เป็นโปรแกรมสำหรับสื่อสารระหว่างเรา กับ OS ให้เรานึกถึงล่ามก็ได้ เขาก็เป็นคนที่ทำการแปลภาษานึงไปเป็นอีกภาษานึง ทำให้เราสามารถเลือกได้ว่า ฝั่งเราที่คุยกับ Shell เราจะใช้ Syntax อย่างไร และ ฝั่งของเครื่องเองว่าเครื่องคุยภาษาอะไร ทำให้แต่ละ Shell มันก็จะมี Syntax ของมันเอง ถ้าเราเคยลองใช้ Command Prompt บน Windows กับทุก Shell บน Linux และ macOS มันจะไม่เหมือนกัน เช่นคำสั่งสำหรับการพ่นพวก ไฟล์ที่อยู่ใน Directory ของเรา ถ้าเป็นคนทั้งโลก ก็จะเป็น ls แต่ถ้าเป็น Command Prompt ก็จะเป็น dir อะไรแบบนั้น มันขึ้นกับ Shell เลยว่า มันจะคุยกับเราด้วยภาษาอะไรยังไง ทำให้เมื่อเปลี่ยน Shell ก็รบกวนอ่านมันหน่อยว่ามันมีอะไรต่างจากชาวบ้านเขามั้ย ไม่งั้นคือใช้ ๆ ไปคือ วดฟ ทำไมมันไม่ได้ฟร๊ะอะไรแบบนั้น

ตัวอย่างของ Shell ที่เราน่าจะได้ใช้งานบ่อย ๆ คือ sh (Bourne Shell), bash (Bourne Again Shell) และตัวที่เราใช้งานอยู่อย่าง zsh (Z Shell) โดยในหนึ่งเครื่อง หรือ OS เราสามารถลงหลาย ๆ Shell เลยนะ เพราะมันก็ไม่ต่างจากการที่เราลงโปรแกรมปกติเลย เราสามารถเรียกมันขึ้นมาได้ตรง ๆ เลย

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

ตัวอย่างเช่น บนเครื่องเราเอง ตั้ง Default เป็น Zsh ไว้ ทำให้เมื่อเราเปิด Terminal บน macOS ขึ้นมา มันก็จะไปเรียก Zsh ขึ้นมาให้เราเองเลย

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

แล้วเราบอกว่า เราไม่อยากใช้ Zsh แล้ว เราอยากใช้ bash แทน เราก็สามารถเรียกมันขึ้นมาได้ตรง ๆ เลย จะสังเกตว่า ด้านหน้า ก่อนที่เราจะพิมพ์คำสั่งมันเปลี่ยนไป จากเดิมเป็นชื่อเครื่องเรานั่นนี่ กลายเป็น bash-3.2$ เลย นั่นเป็นการแสดงให้เราเห็นเลยว่า Shell มันเปลี่ยนแล้วนะ จากนั้น ถ้าเราต้องการออกจาก bash เราก็สามารถใช้คำสั่ง exit ออกได้เลย

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

หรือ เราบอกว่า เราอยากใช้ sh เราก็เรียกมันขึ้นมาได้ตรง ๆ เหมือนกัน

แต่ถ้าตอนนี้ เราอยู่ใน sh แล้วเราสั่ง exit ออกไป มันจะไม่ได้ออกไปที่ Zsh ละ มันจะกลับไปที่ bash แทน ให้เราคิดถึงว่า เราเปิดโปรแกรมซ้อนกันไปเรื่อย ๆ การออกจากโปรแกรมที่อยู่ด้านใน ออกมาก็จะเจอโปรแกรมที่เรียก Shell ที่เราออกไปนั่นเอง ในที่นี้คือ bash ทำให้เมื่อเราออกจาก sh ก็จะกลายเป็น bash และเมื่อเราออกอีก มันก็จะกลับไปหา Zsh

Command Line พื้นฐานที่ Developer ควรรู้ EP 1

สำหรับ macOS เอง ถ้าเราออกจาก Default Shell มันก็จะทำอะไรไม่ได้แล้ว เพราะ Shell มันปิดการทำงานแล้ว อยากใช้อีก เราก็รัน Shell ขึ้นมาใหม่เท่านั้นเอง

ถามว่า ถ้าเราอยากเป็นคนเขียน Shell เองได้มั้ย คำตอบคือได้นะ ไม่ยากเลยจริง ๆๆๆๆๆๆ แต่จะไม่ขอเขียนให้ดูละกัน ภาพบาดตาตอนเขียน Shell ตอนปี 2 (คนบ้าอะไรปลุกเพื่อนขึ้นมาสอนเขียนตอน ตี 5 เพื่อส่งให้ทัน 9 โมง) มันยังไม่หายไป.....

เรื่องพื้นฐานแรกสุดที่เราว่าสำคัญมาก ๆ คือการวิ่งไปวิ่งมาในพวก Directory ให้เรานึกถึงเวลาเราใช้งานพวก File Explore ได้เลย มันคือสิ่งเดียวกัน โดยคำสั่งที่เราใช้ในการจัดการ Directory พื้นฐานเลย มีไม่เยอะมากเท่าไหร่

$ pwd
/

อย่างแรก คือ เราจะต้องรู้ก่อนว่าเราอยู่ที่ไหน เราสามารถใช้คำสั่ง pwd เพื่อถาม Shell ว่าตอนนี้เราอยู่ที่ไหน ตัวอย่างด้านบน มันคืนกลับมาเป็น slash หมายความว่า เราอยู่ที่ Root Directory ของระบบเรา หรือก็คือ สุดหัวสุดแล้ว

$ ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  run.sh  sbin srv  sys  tmp  usr  var 

จากนั้น ถ้าเราอยากรู้ว่า ในที่ ๆ เราอยู่มันมีอะไรบ้าง เราก็สามารถใช้คำสั่งคือ ls ในการถามได้ มันก็จะพ่นสิ่งที่มีอยู่ในที่ ๆ เราอยู่ออกมาให้เรา

$ cd bin
$ pwd
/bin

แล้วถ้าเราบอกว่า เราเห็นแล้วว่า ในที่ ๆ เราอยู่มันมีอะไรบ้าง เราก็สามารถที่จะกระโดดไปได้ เช่น เราบอกว่า เราอยากเข้าไปที่ Folder ชื่อ bin (ไม่ใช่ถังขยะเด้อ มันย่อมาจากคำสั่ง Binaries) เราสามารถใช้คำสั่งชื่อ cd ย่อมาจากคำว่า Change Directory แล้วตามด้วยที่ ๆ เราต้องการกระโดดไป ในที่นี้คือ Folder ชื่อ bin เราก็ใส่ bin เข้าไปเป็น cd bin ถ้ามันไม่มี Error เด้งขึ้นมา แปลว่า เราน่าจะอยู่ใน bin แล้ว เราอยากรู้ Confirm ว่าจริงมั้ย เราก็ใช้คำสั่งเดิมเลย pwd เราจะเห็นว่าจากเดิมเราอยู่ที่ Root ตอนนี้มันเป็น /bin ตามที่เราสั่งมันแล้ว หรือถ้าเราต้องการที่จะกลับไปที่ Directory ก่อนหน้า เช่นในกรณีนี้ ถ้าเราต้องการกลับไปที่ Root เราสามารถใส่ จุด 2 จุด ลงไปแทน Path ได้ เช่นกัน

เราจะเห็นว่า การวิ่งกระโดดไปตามที่อยู่ หรือไฟล์อะไรต่าง ๆ มันไม่ใช่เรื่องยากเลย มีแค่ไม่กี่อันเท่านั้น และเป็นอะไรที่เราใช้เยอะมาก ๆ

Manipulating Directory & File

หลังจากที่เราสามารถวิ่งไปมาตามไฟล์ของเครื่องแล้ว อย่างต่อไปที่เราควรจะเรียนรู้คือ การจัดการไฟล์ และ Folder ต่าง ๆ ภายในเครื่องของเรา ถ้าเป็น GUI ที่เราใช้งานกัน เราก็แค่คลิกขวา เลือก New Folder ก็เป็นอันจบสินะ ใน Command Line ถ้าเราคล่อง ๆ เรื่องพวกนี้คือ ง่าย ๆ ไปเลย

$ mkdir test
$ cd test
$ pwd
/test

เริ่มที่คำสั่งแรกกันเลยคือการสร้าง Folder เราจะใช้คำสั่งชื่อ mkdir หรือเต็ม ๆ คือ Make Directory นั่นเอง จากนั้นตามด้วยชื่อ Folder ที่เราต้องการสร้าง ก็เป็นอันเรียบร้อย แต่ต้องเตือนก่อน เราเจอหลาย ๆ คนจะชอบใส่ชื่อแล้วมี Space ด้วย พวกนี้ เราไม่แนะนำมาก ๆ นะ ถ้าจะเว้น อาจจะใช้พวก Underscore หรือเครื่องหมายอะไรบางอย่างคั่นแทนที่จะเป็น Space ไม่งั้นเหนื่อยเวลาพิมพ์แน่นอนเราบอกเลย

หลังจากเราสร้าง Folder เสร็จ เราก็อาจจะ ls เช็คก่อนก็ได้ หรือจะเข้าไปใน Folder ก็ได้ผ่านคำสั่ง cd ที่เราเล่าไปแล้ว และสุดท้าย เพื่อให้มั่นใจว่า เราอยู่ใน Folder ที่เราเข้าจริง ๆ เราก็อาจจะขอตำแหน่งปัจจุบันเทียบเอาก็ได้

$ touch hello.txt
$ ls
hello.txt

นอกจากนั้น เรายังสามารถสร้างไฟล์เปล่า ๆ ขึ้นมาได้อีกด้วย ผ่านคำสั่งที่ชื่อว่า touch แล้วตามด้วยชื่อไฟล์ มันจะสร้างไฟล์เปล่า ๆ จริง ๆ คือขนาด 0 Byte จริง ๆ ขึ้นมาให้เราเลย เมื่อเรา ls เช็คดู เราจะเห็นเลยว่ามันมีไฟล์นี้อยู่จริง ๆ

$ rm hello.txt
$ ls

อันถัดไปเป็นคำสั่งอันตรายมาก ๆ คือ คำสั่งสำหรับการ ลบ ที่เราจะใช้คำว่า rm หรือย่อมาจากคำว่า Remove เราจะใช้ rm แล้วตามด้วยชื่อไฟล์ที่เราต้องการลบ จากเดิมใน Folder นี้จะมี test.txt อยู่ เมื่อเราลอง ls หลังลบดู เราจะไม่ได้อะไรออกมาเลย แปลว่าใน Directory นี้ ว่างแล้ว นอกจากนั้น มันยังสามารถที่จะลบ Folder ได้ด้วยนะ แต่ถ้าเราใส่ชื่อ Folder เข้าไปมันจะบอกว่า มันเป็น Folder ลบไม่ได้

$ cd ..
$ ls
test

$ rm -r test
$ ls

เราจะต้องเติม Option พิเศษเข้าไปคือ -r หรือ Recursive หมายความว่า มันจะลบทุกอย่างจริง ๆ ที่อยู่ใน Folder ที่เราใส่เข้าไป เช่น ถ้าสมมุติว่าใน Folder test มันมีไฟล์อยู่ การใส่ -r ตอนเราลบ Folder test ไฟล์ทั้งหมดที่อยู่ในนั้นก็จะโดนลบหมดเลยนะ

เราอยากจะย้ำว่า การจะลบอะไร เป็นเรื่องใหญ่มาก ๆ นะ เพราะมันไม่เหมือนกับการใช้ GUI ที่เราใช้กันปกติที่มันจะมี Recycle Bin หรือ Trash ให้เรากู้ไฟล์กลับไปคืนที่เดิมได้นะ ลบแล้วลบเลยนะ ดังนั้นมันก็อันตรายมาก ๆ เลยละ

$ mv test.txt test_1.txt
$ ls
test_1.txt

และคำสั่งสุดท้ายคือ mv ที่ย่อมาจากคำว่า Move เป็นคำสั่งสำหรับการย้ายทั้ง File และ Folder เลย โดยที่เราจะใส่ไฟล์ต้นทางไว้อันแรก เว้น แล้วตามด้วยปลายทางว่าเราอยากจะให้มันไปอยู่ที่ไหนชื่ออะไร

จากตัวอย่างด้านบน เราจะเห็นว่า เราย้ายไฟล์ชื่อ test.txt ไปไว้ test_1.txt ซึ่งจริง ๆ มันก็คือที่เดิมนั่นเอง แต่เราจะเห็นว่าชื่อไฟล์มันเปลี่ยนไป ใช่แล้วฮ่ะ ใน Commnad Line ปกติแล้วเราจะไม่มีคำสั่งสำหรับการ Rename หรือเปลี่ยนชื่อไฟล์ เราสามารถใช้คำสั่ง mv นี่แหละเปลี่ยนชื่อไฟล์ได้เลย เมื่อเราเปลี่ยนแล้ว ls ออกมาดูเราก็จะเห็นว่าชื่อไฟล์มันเปลี่ยนแล้ว

Accessing File

ในส่วนของ File เองมันจะแบ่งเป็น Text และ Binaries File ตอนนี้เราขอเน้นไปที่ Text File ละกัน หรือก็คือไฟล์ที่ประกอบด้วย Text เพียว ๆ เลยพวกนี้เราสามารถอ่านได้ตรง ๆ เลย เรามาดูกันว่า ถ้าตอน GUI เรามีโปรแกรมสำหรับอ่านไฟล์ เช่น Notepad และ Preview บน Command Line มันจะเป็นอย่างไร

$ cat hello.txt
Hello World

คำสั่งแรกคือ cat เป็นคำสั่งที่สั่งให้ Shell มันพ่นทุกอย่างจากในไฟล์ออกมาให้หมด ปัญหาคือ ถ้าสมมุติว่าไฟล์มันใหญ่มาก ๆ ประกอบด้วยข้อความยาวมาก ๆ มันจะไม่สามารถเลื่อน ๆ ได้เหมือนตอนเราใช้ GUI เนอะ ทำให้มันเหมาะกับการแสดงไฟล์ขนาดเล็ก ๆ มากกว่า

หรือถ้ามันยาวมาก ๆ เราอาจจะยากได้แค่ บรรทัดแรก ๆ หรือบรรทัดสุดท้ายขึ้นมา เราก็สามารถใช้คำสั่งชื่อ head และ tail สำหรับแสดงข้อความจากบรรทัดแรก ๆ และ บรรทัดท้าย ๆ ตามลำดับ โดยใช้ Option -n แล้วตามด้วยจำนวนบรรทัดได้อีกด้วย เช่น เราบอกว่า เราอยากได้ 5 บรรทัดบน เราก็สามารถใช้ head -n 5 <ชื่อไฟล์> ก็ได้เลย ง่ายมาก ๆ

นอกจากนั้น ถ้าเราบอกว่า เราไม่รู้เลยว่าของที่เราต้องการมันอยู่ตรงไหน เราจะไล่หาทั้งไฟล์เลย แต่เราบอกว่า cat มันจะพ่นออกมาหมดเลย มันก็จะมีคำสั่งในการเปิด Text File ให้ออกมาอยู่ในรูปแบบที่เราสามารถเลื่อนขึ้นลงได้เหมือนเปิด Text Editor บนพวก GUI เลยคือ คำสั่งคือ less แล้วตามด้วยชื่อไฟล์ เราก็จะสามารถใช้ ลูกศร หรือปุ่ม Page Up และ Down ในการเลื่อนขึ้นลง แล้วใช้ q เพื่อออกได้เลย

ข้อควรระวังสำหรับมือใหม่

ด้วยความที่ Command Line เราสื่อสารกับเครื่องผ่านตัวหนังสือเท่านั้น ดังนั้น ถ้าเราติดปัญหา พิมพ์แล้วมัน Error อะไร อย่าพึ่งตกใจไป แนะนำว่า ให้เราลองเช็คทุกตัวอักษรก่อนว่า เราพิมพ์ถูกหรือไม่ เพราะส่วนใหญ่ 90% ที่เราเจอคือ พิมพ์ผิดจ้าาาา

โดยเราจะแบ่งออกเป็น 2 จุดที่จะพิมพ์ผิดกัน อย่างแรกคือ ชื่อคำสั่ง อันนี้ผิดไม่ได้เลยเด้อ เพราะมันจะไปเรียกผิดโปรแกรม หรือถ้าโปรแกรมมันไม่มีอยู่จริง มันจะฟ้องออกมาเลยว่า เห้ยยย โปรแกรมที่เราเรียกมันไม่มีจริงเด้อ อันนี้อาจจะต้องไปเช็คว่าโปรแกรมที่เราเรียกจริง ๆ มันชื่ออะไร หรือะเราแค่พิมพ์ผิดกันแน่

และอีกจุดคือ พวก Option และ Path ที่เราเรียกมันอาจจะไม่มีอยู่จริง ส่วนของ Option แนะนำให้เช็คกับ Manual ของโปรแกรมนั้น ๆ ว่า มันมี Option นี้อยู่จริงหรือไม่ และ มันทำในแบบที่เราต้องการหรือไม่ ส่วน Path เอาจริง ๆ คือ เริ่มจากเช็คก่อนว่า มันมีไฟล์ หรือ Folder อยู่จริงหรือไม่ และ ตัว Path เองต้องพิมพ์ให้ถูกทุกตัวอักษรนะ สำคัญมาก ๆ

สรุป

ในตอนนี้เรามาทำความรู้จักกับ Command Line และโปรแกรมที่สำคัญอย่าง Shell ที่ทำหน้าที่เหมือนล่ามคนกลางคุยกับเรา กับ OS ให้รู้เรื่อง เพื่อให้เราสามารถ จัดการ Directory และ File รวมไปถึงการเรียกโปรแกรมต่าง ๆ ขึ้นมาได้ด้วย โดยที่พวก Command Line มันจะทำให้เราสามารถเรียก Option อะไรได้ละเอียดกว่าการใช้งานพวก GUI เยอะพอสมควร ทำให้การใช้ Command Line เป็น เหมือนกับเรามีพลังอยู่ในมือเยอะมาก ๆ นั่นแปลว่า great power comes with great responsibility ดั่งในเรื่อง Spider Man อย่าไปลบอะไรมั่วซั่วละ มันแตกได้เลยนะ ตอนหน้าเราจะลองไปดูคำสั่งอะไรที่มัน Advance กว่านี้หน่อยอย่างเรื่องของ User & Permission กันว่า เราจะจัดการกับเรื่องพวกนี้ได้อย่างไร โดยที่เรามีแค่หน้า Command Line