gum: เครื่องปรุงลับที่ทำให้ Shell Script ของคุณน่าใช้งานขึ้นทันตา

ไทย

DevOps Interactive CLI

หากคุณเคยเขียน shell script ไว้ใช้เองในโปรเจกต์ต่างๆ แล้วกลับมาเปิดดูอีกทีในอีกไม่กี่เดือนให้หลัง คุณอาจพบว่ามันไม่ง่ายอย่างที่คิดไม่ว่าจะเป็น ข้อความรกเต็มหน้าจอ, ตัวเลือกต่างๆ ไม่มีความชัดเจน, หรือแม้แต่ลืมไปว่า script ต้องใส่พารามิเตอร์อะไรบ้าง

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

🔍 gum คืออะไร?

gum คือ CLI จาก Charm ที่ช่วยให้เราสามารถเพิ่มการโต้ตอบ(interaction) และความสวยงามให้กับ shell script ของเราได้อย่างง่ายดาย โดยไม่ต้องเขียนโปรแกรมซับซ้อน เช่น การแสดงเมนูให้เลือก, ป้อนข้อมูล, ยืนยันคำสั่ง, หรือแม้กระทั่งทำ progress bar

📦 การติดตั้ง gum

ติดตั้งผ่าน Homebrew:

				
					brew install charmbracelet/tap/gum
				
			

หรือติดตั้งผ่าน go:

				
					go install github.com/charmbracelet/gum@latest
				
			

✨ ตัวอย่างการใช้งานเบื้องต้น

1. แสดงข้อความ

				
					gum style --foreground 212 "Deploying to production..."
				
			

2. สร้างเมนูให้เลือก

				
					CHOICE=$(gum choose "Deploy" "Rollback" "Exit")
echo "You selected: $CHOICE"
				
			

3. รับค่าจากผู้ใช้

				
					NAME=$(gum input --placeholder "Enter your name")
echo "Hello, $NAME"
				
			

4. แสดงกล่องข้อความยืนยัน

				
					if gum confirm "Do you want to continue?"; then
  echo "Proceeding..."
else
  echo "Cancelled."
fi
				
			

✨ ตัวอย่างการใช้งานจริง

ในทีมที่ผมทำงานนั้นมีการจัดการสิทธิ์ในการเชื่อมต่อเครื่อง VM หรือ Kubernetes cluster ต่างๆด้วย Teleport ซึ่งงานของผมส่วนมาก ผมจะถนัดใช้งานใน terminal มากกว่าใน Web UI เลยทำ script มาไว้สำหรับการเชื่อมต่อ VM และ script สำหรับการเชื่อมต่อ Kubernetes cluster ที่จะต้องทำงาน support ในแต่ละวัน

1. script เชื่อมต่อ VM

				
					#! /bin/zsh
# Check if tsh login is needed
if ! tsh status >/dev/null 2>&1; then
    echo "Not logged in to Teleport. Please login first with: tsh login"
    exit 1
fi

# Get list of instances from teleport
INSTANCES=$(tsh ls | tail -n +2 | awk '{print $1}')

# Use gum filter to select an instance
SELECTED_INSTANCE=$(echo "$INSTANCES" | gum filter --placeholder "Select an instance to connect...")

# If an instance was selected, SSH into it
if [[ ! -z "$SELECTED_INSTANCE" ]]; then
    
    
    tsh ssh john.doe@$SELECTED_INSTANCE 
fi
				
			

script ข้างต้นทำให้ผมไม่ต้องสั่งหลายคำสั่งเพื่อหาเครื่องที่อยาก ssh เข้าไปได้

console output show script implementation

เมื่อรัน script แล้วเลือกเครื่องที่ต้องการได้ก็สามารถเข้าใช้งานเครื่อง VM ได้ตามปกติทันที

console output show script behavior after execute

2. script เชื่อมต่อ Kubernetes cluster

				
					#!/bin/zsh

# Get list of available k8s clusters from teleport
clusters=$(tsh kube ls | tail -n +2 | awk '{print $1}')

# Use gum filter to select cluster
selected_cluster=$(echo "$clusters" | gum filter --placeholder="Choose a Kubernetes cluster...")

if [ -n "$selected_cluster" ]; then
    # Configure kubeconfig for selected cluster
    tsh kube login "$selected_cluster"
    echo "Configured kubectl for cluster: $selected_cluster"
else
    echo "No cluster selected"
    exit 1
fi
				
			

สำหรับคนที่ต้องดูแลหลาย cluster แล้วยังไม่คุ้นชินกับ cluster ทั้งหมดที่มี การต้องสลับ cluster ไปมาเพื่อ support ปัญหาที่เกิดขึ้นในแต่ละวัน คงเป็นเรื่องน่าหงุดหงิดใจไม่น้อย script ข้างต้นจะช่วยให้เราสลับ cluster ได้โดยไม่ต้องสั่งหลายๆคำสั่งเพื่อให้รู้ว่าต้องเข้าไปที่เครื่องไหน

✨ ความยืดหยุ่นของ script จากที่ได้จาก gum

จากตัวอย่าง script เชื่อมต่อ Kubernetes ข้างบน ประโยชน์ของมันอาจจะไม่มากถ้าเราทำงานไปนานๆ แล้ว cluster ไม่ได้มีการเปลี่ยนชื่อ หรือมี cluster ใหม่เพิ่มเข้ามา เราสามารถทำให้ script นั้นมีประโยชน์เพิ่มเติมได้เช่น ถ้าในแต่ละ cluster มี namespace คนละชื่อกันล่ะ 

				
					#!/bin/zsh

  # Get list of available k8s clusters from teleport
  clusters=$(tsh kube ls | tail -n +2 | awk '{print $1}')

  # Use gum filter to select cluster
  selected_cluster=$(echo "$clusters" | gum filter --placeholder="Choose a Kubernetes cluster...")

- if [ -n "$selected_cluster" ]; then
-     # Configure kubeconfig for selected cluster
-     tsh kube login "$selected_cluster"
-     echo "Configured kubectl for cluster: $selected_cluster"
- else
-     echo "No cluster selected"
-     exit 1
- fi
+ [ -z "$selected_cluster" ] && { gum log --level error "No cluster selected"; exit 1; }

+ # Configure kubeconfig for selected cluster
+ tsh kube login "$selected_cluster"
+ gum log --level info "Configured kubectl for cluster: $selected_cluster"

+ # Get list of namespaces and select using gum
+ selected_namespace=$(kubectl get namespaces -o name | cut -d'/' -f2 | gum filter --placeholder="Choose a namespace...")

+ [ -z "$selected_namespace" ] && { gum log --level error "No namespace selected"; exit 1; }

+ # Launch k9s in selected namespace
+ gum log --level info "Launching k9s in namespace: $selected_namespace"
+ k9s -n "$selected_namespace"
				
			

การแก้ไข script เพื่อให้ตอบโจทย์ปัญหาของเรานั้นทำได้ง่ายมาก แม้ว่าจะทิ้ง script นั้นไว้นานแค่ไหน แค่เรากลับมาอ่านเราก็สามารถรู้ได้เลยว่า script ของเราเดิมทำอะไรตรงไหนบ้าง

gum ช่วยให้การเขียน shell script มีความเป็นมิตรกับผู้ใช้งานมากขึ้น ด้วยความสามารถในการรับข้อมูลจากผู้ใช้ได้หลากหลายรูปแบบ แสดงผลลัพธ์ที่อ่านง่าย และตกแต่งให้ทั้ง script และ log ดูสวยงามได้อย่างง่ายดาย ไม่ต้องใช้โค้ดซับซ้อน การจะแก้ไข script ก็สามารถทำได้ง่าย ช่วยให้ script เป็นมิตรกับผู้พัฒนาอ่านง่าย แม้จะอ่าน script เป็นครั้งแรกก็ตาม

ถ้าคุณเริ่มสนุกกับการทำ CLI แบบ interactive แล้วล่ะก็ Charm ยังมีเครื่องมือเจ๋งๆ อีกเพียบ ไม่ว่าจะเป็น bubbletea สำหรับสร้าง CLI UI แบบครบเครื่อง, bubbles สำหรับคอมโพเนนต์พร้อมใช้, หรือ lipgloss สำหรับจัดการธีมและสีสันอย่างมืออาชีพ

 ไม่แน่วันนึง script ที่คุณเขียนใช้เองเล่นๆ อาจจะช่วยแก้ปัญหาของใครหลายๆคนก็ได้นะ

ท้ายนี้ SCB TechX พร้อมเป็น Tech Partner ที่เข้าใจธุรกิจคุณ จากประสบการณ์ดูแลระบบขนาดใหญ่ เราช่วยวาง DevOps Flow ที่อัตโนมัติ รองรับการเติบโตได้ในอนาคต


สนใจบริการโปรดติดต่อเราที่ https://bit.ly/3HjjrSE
อ่านรายละเอียดเพิ่มเติมคลิก https://bit.ly/4dpGl6U

Related Content

  • ทั้งหมด
  • Blogs
  • Insights
  • News
  • Uncategorized
    •   Back
    • Careers
    • Data Science
    • Lifestyle
    • Product
    • Strategy
    • Technology
    • User Experience
    • xPlatform
    • DevOps
    •   Back
    • PointX Products
    • Events
    • Others
    • Leadership
    • Partnership
    • Services & Products
    • Joint ventures
    •   Back
    • Blockchain
    • Finance
    • Tech innovation

Your consent required

If you want to message us, please give your consent to SCB TechX to collect, use, and/or disclose your personal data.

| การเพิกถอนความยินยอม

หากคุณต้องการเพิกถอนการให้ความยินยอมในการเก็บรวบรวม ใช้ และ/หรือเปิดเผยข้อมูลส่วนบุคคล กรุณาส่งคำร้องหาเรา

Vector

Message sent

We have receive your message and We will get back to you shortly.