แนะนำ Bash Command สำหรับ Developer มือใหม่
Originally published at https://somprasongd.work/blog/server/baisc-bash
แม้ว่า GUI จะช่วยให้การเขียนโค้ดง่ายขึ้น แต่เมื่อคุณเริ่มทำงานจริงโดยเฉพาะกับระบบ backend, deployment, หรือ CI/CD — การใช้ Terminal และ Bash Command กลายเป็นทักษะที่ขาดไม่ได้
บทความนี้ออกแบบมาสำหรับ developer มือใหม่ ที่ไม่คุ้นกับการใช้ command line โดยใช้โปรเจกต์ Go สมมติชื่อ myapp เป็นตัวอย่าง
รายชื่อคำสั่งที่ควรรู้จัก
พื้นฐานและจัดการไฟล์
-
pwd,ls,cd,touch,mkdir,rm,cat,less,head,tail,echo
ค้นหาและแก้ไข
-
grep,find,nano,vim
รันโปรเจกต์ / ดู process
-
go run,go build,ps,top,kill
จัดการ Git
-
git clone,git status,git log
ประมวลผลข้อความ
-
awk,sed,jq
การเรียก API และ Network เบื้องต้น
-
curl,ping,wget,netstat,lsof
จัดการ Environment Variable
-
export,.env,source,$VAR
เขียน Shell Script
-
#!/bin/bash, ตัวแปร, เงื่อนไข (if,loop)
สมมติฐาน: โปรเจกต์ Go ชื่อ myapp
git clone https://github.com/yourusername/myapp.git
cd myapp
1. พื้นฐานและจัดการไฟล์
pwd – แสดง path ปัจจุบัน
pwd
เช่น:
/Users/somprasong/projects/myapp
ls – แสดงรายการไฟล์
ls # แสดงรายการไฟล์และโฟลเดอร์ในไดเรกทอรีปัจจุบัน (แบบสั้น)
ls -lah # แสดงรายการไฟล์ทั้งหมด (รวมไฟล์ที่ขึ้นต้นด้วย .)
# -l : แสดงรายละเอียด เช่น permission, owner, size, date
# -a : แสดงไฟล์ทั้งหมด รวมถึงไฟล์ซ่อน (ที่ขึ้นต้นด้วย .)
# -h : แสดงขนาดไฟล์ให้อ่านง่าย (เช่น KB, MB)
cd – เปลี่ยนโฟลเดอร์
cd cmd # เปลี่ยนไปยังโฟลเดอร์ย่อยชื่อ cmd (ภายใต้ไดเรกทอรีปัจจุบัน)
cd .. # ย้อนกลับไปยังโฟลเดอร์แม่ (parent directory)
cd - # กลับไปยังไดเรกทอรีก่อนหน้าที่เคยอยู่ (toggle ไป toggle มา)
# ตัวอย่าง: อยู่ใน /project/cmd แล้ว cd .. ไป /project
# หากรัน cd - จะกลับไป /project/cmd อีกครั้ง
touch – สร้างไฟล์เปล่า
touch config.yaml # สร้างไฟล์เปล่าชื่อ config.yaml
# หากไฟล์นี้มีอยู่แล้ว จะไม่ทำอะไร (แต่จะอัปเดตเวลาการเข้าถึง)
mkdir – สร้างโฟลเดอร์
mkdir logs # สร้างโฟลเดอร์ชื่อ logs (ถ้ายังไม่มีอยู่)
mkdir -p logs/2025/july # สร้างโฟลเดอร์ซ้อนกันหลายชั้นในครั้งเดียว
# -p คือให้สร้างโฟลเดอร์ parent (2025) โดยอัตโนมัติหากยังไม่มี
rm – ลบไฟล์หรือโฟลเดอร์
rm config.yaml # ลบไฟล์ชื่อ config.yaml (เฉพาะไฟล์เดียว)
rm -rf logs/ # ลบโฟลเดอร์ logs และทุกไฟล์/โฟลเดอร์ย่อยภายใน
# -r คือ recursive (ลบทั้งโฟลเดอร์)
# -f คือ force (ไม่ถามยืนยัน)
คำสั่ง rm -rf ต้องใช้อย่างระมัดระวัง เพราะจะลบทุกอย่างโดยไม่ถาม
2. คำสั่งอ่าน / ค้น / แก้ไขไฟล์
cat – อ่านไฟล์ทั้งหมด
cat README.md
less – อ่านไฟล์แบบ scroll
less README.md
กด q เพื่อออก
head และ tail – ดูต้นหรือท้ายไฟล์
head main.go # 10 บรรทัดแรก
tail main.go # 10 บรรทัดสุดท้าย
echo – แสดงข้อความ / ตัวแปร
echo "Hello, Go Developer" # แสดงข้อความ
echo $HOME # แสดงค่าตัวแปร environment
echo "Build status: $STATUS" # แสดงค่าตัวแปรที่เรากำหนดเอง
บันทึกค่าไปไฟล์
echo "PORT=8080" > .env # สร้างไฟล์ .env พร้อมกำหนดค่า
echo "DEBUG=true" >> .env # เพิ่มบรรทัดใหม่ต่อท้าย
3. การค้นหาไฟล์ / ข้อความ
grep – ค้นหาคำในไฟล์
grep "func main" main.go
# ค้นหาข้อความ "func main" ในไฟล์ main.go
# ใช้เพื่อหา function entry point ในภาษา Go
grep -i "http" *.go
# ค้นคำว่า "http" (ไม่สนว่าเป็นตัวพิมพ์ใหญ่หรือเล็ก) ในทุกไฟล์ .go
# มีประโยชน์เวลาอยากหาว่าไฟล์ไหนเรียกใช้งาน HTTP client หรือ HTTP handler
find – ค้นหาไฟล์
find . -name "*.go"
# ค้นหาไฟล์ทั้งหมดที่ลงท้ายด้วย .go จาก path ปัจจุบันและทุกโฟลเดอร์ย่อย
# ใช้แทนการ grep ทั้ง project หรือเตรียมทำ build/check ทั่วโปรเจกต์
find . -type f -name "*.yaml"
# ค้นหาไฟล์ (`-type f`) ที่ชื่อจบด้วย .yaml เท่านั้น
# เหมาะสำหรับหา config ที่เก็บในหลายๆ โฟลเดอร์ เช่น `config/dev.yaml`, `config/test/app.yaml`
4. แก้ไขไฟล์จาก terminal
nano – editor แบบง่าย
nano config.yaml
เปิดไฟล์ config.yaml ขึ้นมาแก้ไขด้วย editor nano ซึ่งใช้งานง่าย เหมาะสำหรับมือใหม่
วิธีบันทึกและออกจาก nano:
- กด
Ctrl + Oเพื่อบันทึกไฟล์ (O = Output)- กด Enter ยืนยันชื่อไฟล์
- กด
Ctrl + Xเพื่อออกจาก nano (X = Exit)
vim – editor แบบมืออาชีพ
vim main.go
เปิดไฟล์ main.go ด้วย vim ซึ่งเป็น editor ทรงพลังและเร็วมาก เหมาะกับผู้ที่ใช้ terminal เป็นประจำ
โหมดพื้นฐานใน vim:
-
Normal mode– สำหรับสั่งงาน (เปิดโปรแกรมจะเริ่มที่โหมดนี้) -
Insert mode– สำหรับพิมพ์ข้อความ (iเพื่อเข้า insert) -
Command mode– สำหรับรันคำสั่ง (:เพื่อเข้า)
วิธีบันทึกและออกจาก vim:
- กด
Escเพื่อออกจากโหมด insert (กลับไปที่ normal mode) - พิมพ์
:wแล้วกด Enter → บันทึกไฟล์ (write) - พิมพ์
:qแล้วกด Enter → ออกจาก vim (quit) - หรือใช้รวมกัน
:wq→ บันทึกและออก - ถ้าไม่อยากบันทึกการเปลี่ยนแปลง: พิมพ์
:q!→ ออกโดยไม่บันทึก
ถ้าคุณเพิ่งเริ่มใช้ terminal แนะนำเริ่มจาก
nanoก่อน แล้วค่อยเรียนรู้vimเมื่อเริ่มคุ้นเคยมากขึ้น
5. รันโปรเจกต์ Go และจัดการ process
go run – รันโปรแกรม
go run main.go
go build – คอมไพล์แอป
go build -o myapp # คอมไพล์ไฟล์ Go ทั้งโปรเจกต์เป็นไฟล์ไบนารีชื่อ myapp
# -o ระบุชื่อไฟล์เอาต์พุตเอง (output)
./myapp # รันไฟล์ไบนารี myapp ที่เพิ่งคอมไพล์ออกมา
ps, top, kill – ดูและจัดการ process
ps aux | grep myapp
# ดูรายชื่อ process ทั้งหมดในระบบ (ps aux)
# และกรองแสดงเฉพาะบรรทัดที่มีคำว่า "myapp"
# เพื่อเช็คว่าโปรแกรมชื่อ myapp กำลังรันอยู่หรือไม่ พร้อมแสดง PID (Process ID)
top
# แสดงสถานะ process แบบ real-time
# แสดงการใช้งาน CPU, Memory และ process ที่กำลังทำงานมากที่สุด
# กด 'q' เพื่อออกจากหน้าจอ top
kill -9 <pid>
# สั่งให้ระบบหยุด process โดยใช้ PID ที่ต้องการ
# -9 คือส่งสัญญาณ SIGKILL เพื่อบังคับหยุด proce
6. ใช้ Git เบื้องต้น
git status
# แสดงสถานะปัจจุบันของ repository
# แจ้งไฟล์ที่มีการเปลี่ยนแปลง ยังไม่ได้ commit หรือไฟล์ที่ยังไม่ถูก track
git add <file>
# เพิ่มไฟล์เข้าสู่ staging area เพื่อเตรียม commit
# เช่น git add main.go
git commit -m "ข้อความบรรยาย"
# บันทึก snapshot ของไฟล์ที่อยู่ใน staging area พร้อมข้อความอธิบาย
git log --oneline
# แสดงประวัติ commit แบบย่อ สั้นๆ เหมาะสำหรับดูภาพรวม
git branch
# แสดงรายการสาขา (branches) ใน repository ปัจจุบัน
git checkout <branch-name>
# สลับไปยัง branch ที่ระบุ
git pull
# ดึงการเปลี่ยนแปลงล่าสุดจาก remote repository มารวมกับ branch ปัจจุบัน
git push
# ส่ง commit ที่ทำไปยัง remote repository
git clone <url>
# คัดลอก (clone) repository จาก remote มายังเครื่องเรา
7. การจัดการ Environment Variables
export – กำหนดตัวแปรใน session
export PORT=8080
# กำหนดตัวแปร PORT ให้มีค่าเป็น 8080 และ export ไปยัง environment
# ทำให้โปรแกรมหรือ shell อื่นสามารถเข้าถึงค่าตัวแปรนี้ได้
export DEBUG=true
# กำหนดตัวแปร DEBUG ให้มีค่า true
เรียกใช้ตัวแปร
echo $PORT
# แสดงค่าของตัวแปร PORT
# ผลลัพธ์: 8080
การโหลดค่าตัวแปรจากไฟล์ .env
source .env
# อ่านและโหลดค่าตัวแปรจากไฟล์ .env เข้าสู่ environment
# ไฟล์ .env มักใช้เก็บค่าคอนฟิก เช่น PORT=3000, DB_URL=...
หมายเหตุ: ไฟล์ .env ควรอยู่ในรูปแบบ KEY=value ต่อบรรทัด เช่น
PORT=3000
DEBUG=false
ใช้ตัวแปรร่วมกับคำสั่งอื่น
go run main.go
# ใช้งานโปรแกรม Go โดยอ้างอิงค่าจาก $PORT หรือ $DEBUG ภายในโค้ดได้
# เช่น os.Getenv("PORT") ในภาษา Go
ลบตัวแปรออกจาก environment
unset PORT
# ลบตัวแปร PORT ออกจาก environment
การใช้ environment variables เป็นเรื่องพื้นฐานที่สำคัญมากในงาน dev เพราะช่วยให้แยก config ออกจาก code และควบคุมการทำงานได้ง่ายในแต่ละ environment (dev, staging, prod)
8. คำสั่ง Network ที่ควรรู้
ping – ตรวจสอบว่า host online หรือไม่
ping google.com
# ส่ง ICMP request ไปยัง google.com แบบไม่จำกัดจำนวนครั้ง (ต้องกด Ctrl+C เพื่อหยุดเอง)
ตัวเลือก (option) ที่นิยมใช้บ่อย
ส่งจำนวนจำกัด (c)
ping -c 4 google.com
# ส่ง ping ไปยัง google.com จำนวน 4 ครั้ง แล้วหยุดอัตโนมัติ
กำหนดเวลาระหว่างการ ping (i)
ping -i 0.5 google.com
# ส่ง ping ทุก ๆ 0.5 วินาที (ค่า default คือ 1 วินาที)
แสดงเวลารวม (D)
ping -D -c 2 google.com
# แสดง timestamp ของแต่ละ reply (ใช้ดู latency แบบมีเวลาประกอบ)
ตรวจสอบด้วย IP โดยตรง
ping 8.8.8.8
# ใช้ ping ด้วย IP โดยไม่ผ่าน DNS lookup
ใช้ IPv6 (6)
ping -6 google.com
# ใช้ IPv6 แทน IPv4 ในการ ping
หมายเหตุสำหรับการใช้ในระบบ Linux/macOS:
-
pingบน macOS มี option บางตัวที่ต่างจาก Linux เล็กน้อย เช่นtบน macOS คือจำนวนครั้ง แต่บน Linux คือ TTL (time to live) - ควรตรวจสอบ
man pingเพื่อดู option ทั้งหมดในระบบของคุณ
curl – เรียก API
curl http://localhost:8080/health
# ส่ง HTTP GET request ไปยัง endpoint /health บน localhost port 8080
ตัวเลือก (option) ที่นิยมใช้บ่อย
แสดง header ของ response (i)
curl -i http://localhost:8080/health
# แสดง HTTP response header ด้วย
แสดงเฉพาะ HTTP status code (o /dev/null -w "%{http_code}" -s)
curl -o /dev/null -s -w "%{http_code}n" http://localhost:8080/health
# ใช้ตรวจสอบว่า endpoint ตอบกลับด้วย status code อะไร (เช่น 200, 404)
ส่งข้อมูลแบบ JSON (X POST -H "Content-Type: application/json" -d)
curl -X POST http://localhost:8080/api
-H "Content-Type: application/json"
-d '{"username": "admin", "password": "1234"}'
# ส่ง HTTP POST request พร้อม payload JSON
อ่านค่า header ที่ส่งกลับมา (I)
curl -I http://localhost:8080/
# ส่ง HTTP HEAD request (ไม่โหลดเนื้อหา) เพื่อดู header เท่านั้น
เก็บผลลัพธ์ลงไฟล์ (o)
curl -o response.json http://localhost:8080/api/data
# บันทึกผลลัพธ์ของ HTTP response ลงไฟล์ response.json
ใช้กับไฟล์ .env ที่มี token หรือ env var
curl -H "Authorization: Bearer $API_TOKEN" http://localhost:8080/api
# ส่ง header พร้อม token จากตัวแปร environment
ใช้ curl ทดสอบ REST API เบื้องต้น
curl -X GET http://localhost:8080/users
curl -X POST http://localhost:8080/users -d '{"name": "go dev"}' -H "Content-Type: application/json"
คำสั่ง curl เหมาะสำหรับ:
- ทดสอบ health check
- ตรวจสอบ endpoint ในระบบ microservices
- Debug API เบื้องต้น
- ใช้ร่วมกับ
jqเพื่อจัดรูปแบบ JSON
wget – ดาวน์โหลดไฟล์
wget http://example.com/file.txt
# ดาวน์โหลดไฟล์จาก URL ไปยังไฟล์ในเครื่อง
ตัวเลือก (option) ที่ใช้บ่อย
1. O <filename> – เปลี่ยนชื่อไฟล์ที่บันทึก
wget -O myfile.txt http://example.com/file.txt
# ดาวน์โหลดแล้วเซฟเป็นชื่อ myfile.txt
2. c – ดาวน์โหลดต่อ (resume) หากไฟล์ยังไม่เสร็จ
wget -c http://example.com/largefile.zip
# หากหลุดระหว่างโหลด สามารถใช้ -c โหลดต่อจากจุดเดิมได้
3. -limit-rate=200k – จำกัดความเร็วในการดาวน์โหลด
wget --limit-rate=200k http://example.com/file.txt
# ดาวน์โหลดโดยจำกัดความเร็วที่ 200KB/s
4. -no-check-certificate – ข้ามการตรวจสอบ SSL (ใช้กับ HTTPS)
wget --no-check-certificate https://example.com/file.txt
# ใช้กรณี certificate ไม่ valid เช่น เซิร์ฟเวอร์ dev
5. -user=<username> --password=<password> – สำหรับเว็บไซต์ที่ต้อง login
wget --user=admin --password=secret http://example.com/protected.zip
# ใช้เมื่อจำเป็นต้องใส่ username/password
6. r – ดาวน์โหลดแบบ recursive (ทั้ง directory)
wget -r http://example.com/files/
# ดาวน์โหลดทั้ง directory และไฟล์ย่อยทั้งหมด
7. -no-parent – ไม่ขึ้นไปโหลด path ด้านบน
bash
Copy code
wget -r --no-parent http://example.com/files/
# ดาวน์โหลดเฉพาะไฟล์ภายใน path นั้น ไม่ย้อนกลับขึ้นไป directory ข้างบน
ตัวอย่างการใช้งานร่วมกัน
wget -c -O backup.zip http://example.com/backup.zip
# ดาวน์โหลดไฟล์ backup.zip และสามารถ resume ได้หากหลุด
netstat – ดูว่าโปรแกรมไหนเปิดพอร์ต
netstat -tulnp
ความหมายของแต่ละ option:
-
t= แสดงเฉพาะ TCP -
u= แสดงเฉพาะ UDP -
l= แสดงเฉพาะที่อยู่ในสถานะ “listening” (รอฟังการเชื่อมต่อ) -
n= แสดง IP และพอร์ตเป็นตัวเลข (ไม่แปลงเป็นชื่อ) -
p= แสดงโปรเซส (PID) และชื่อโปรแกรมที่ใช้พอร์ตนั้น (ต้องใช้sudoในบางระบบ)
ตัวอย่างผลลัพธ์:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
udp 0 0 0.0.0.0:123 0.0.0.0:*
lsof – ดูว่าใครใช้พอร์ต
lsof -i :8080
# i :8080 หมายถึงให้แสดงเฉพาะโปรเซสที่เปิดใช้งานพอร์ต 8080
ตัวอย่างผลลัพธ์:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
myapp 1234 user 10u IPv4 12345 0t0 TCP *:http-alt (LISTEN)
คุณสามารถดูว่าแอปอะไรใช้งานพอร์ต และจะนำ PID (1234 ในตัวอย่าง) ไปใช้กับ kill ได้เช่น
kill -9 1234
9. ประมวลผลข้อความ
awk – ดึง column จากข้อความ
awk '{print $1}' access.log # ดึงข้อมูลคอลัมน์แรกจากไฟล์
# ดึงคอลัมน์ที่ 7 (เช่น URL ที่เรียก):
awk '{print $7}' access.log
# ดึงหลายคอลัมน์พร้อมกัน:
awk '{print $1, $7}' access.log
# ใช้กับ pipe (เช่น log จากคำสั่งอื่น):
cat access.log | awk '{print $1}'
ตัวอย่างเช่น
ไฟล์ access.log มีข้อมูล
192.168.1.1 - - [21/Jul/2025:12:00:00] "GET /index.html HTTP/1.1" 200 1234
127.0.0.1 - - [21/Jul/2025:12:01:00] "POST /login HTTP/1.1" 302 0
คำสั่ง awk '{print $1}' access.log จะได้ผลลัพธ์เป็น
192.168.1.1
127.0.0.1
sed – แก้ข้อความในไฟล์
sed 's/localhost/127.0.0.1/g' config.yaml
# แทนที่คำว่า localhost ด้วย 127.0.0.1
# 's/localhost/127.0.0.1/g' =
# s = substitute (คำสั่งแทนที่)
# localhost = คำที่ต้องการค้นหา
# 127.0.0.1 = คำที่ใช้แทน
# g = global คือ แทนที่ทุกจุดที่เจอในแต่ละบรรทัด
# config.yaml = ชื่อไฟล์ต้นทาง
คำสั่งนี้จะแสดงผลลัพธ์ใหม่ที่มีการแทนที่ localhost ด้วย 127.0.0.1 ทุกแห่งในแต่ละบรรทัด แต่ยังไม่บันทึกลงไฟล์
ถ้าต้องการเขียนกลับลงไฟล์
ใช้ option -i เพื่อแก้ไขในไฟล์จริง:
sed -i 's/localhost/127.0.0.1/g' config.yaml
หมายเหตุ: บน macOS อาจต้องใช้ -i ''
sed -i '' 's/localhost/127.0.0.1/g' config.yaml
jq – แก้ไข JSON
curl -s http://localhost:8080/status | jq '.'
# jq '.' แสดง JSON ทั้งก้อนแบบสวยงาม (pretty print)
# ตัวอย่างเพิ่มเติมของ jq
# jq '.status' ดึงค่าจาก key status
# jq '.data.name' ดึงค่าจาก nested key เช่น .data.name
# `jq '.items[].id'` ดึงค่าของฟิลด์ id จากทุก element ที่อยู่ใน array items ของ JSON
# jq '.users[] | select(.active == true)'
# .users[] วนลูปผ่านแต่ละ element ใน array ชื่อ users
# select(.active == true) กรอง (filter) เฉพาะ element ที่มี field active เท่ากับ true
10. เขียน Shell Script เบื้องต้น
ไฟล์: build.sh
#!/bin/bash
echo "Building myapp..."
go build -o myapp
if [ $? -eq 0 ]; then
echo "✅ Build success"
else
echo "❌ Build failed"
fi
ให้สิทธิ์รัน:
chmod +x build.sh
./build.sh
11. เสริม productivity
history # ดูคำสั่งย้อนหลัง
!! # รันคำสั่งล่าสุด
alias gs="git status" # สร้าง shortcut คำสั่ง
สรุป
Developer มือใหม่ไม่จำเป็นต้องจำคำสั่งทั้งหมดในคราวเดียว แต่ควรเริ่มจากคำสั่งที่ ใช้กับงานจริงในโปรเจกต์ตัวเอง เช่น แก้ config, รันแอป, แสดงค่าตัวแปร, แก้ .env, หรือดู log จาก production
เมื่อคุ้นมือแล้ว คุณจะเริ่มใช้ bash เป็นเครื่องมือสร้างระบบ build, deploy, หรือ monitoring script ที่ยืดหยุ่นและควบคุมได้เอง 100%