หลังจากเลือก Ghostty เป็น terminal หลัก (เล่าไว้ในบทความก่อนหน้า) ก็ถึงตาตั้งค่าให้ใช้งานได้จริง พอไปหาวิธี ก็เจอสคริปต์ยอดนิยมแบบหนึ่งที่สัญญาว่า รันคำสั่งเดียวจบ ลง Ghostty, Zsh, prompt สวยๆ และเครื่องมือ CLI สมัยใหม่อีกสามสิบตัวให้ในทีเดียว
น่าลองมาก คำสั่งก๊อปมาวางแค่บรรทัดเดียว แต่บรรทัดนั้นคือ curl ดึงสคริปต์จากเน็ตแล้วส่งเข้า bash รันทันที ก่อนจะกด Enter เราเปิดอ่านว่ามันทำอะไรบ้าง แล้วสิ่งที่เห็นทำให้ตัดสินใจไม่รัน
ช่วงที่ 1สคริปต์คำสั่งเดียวทำอะไรกับเครื่องบ้าง
ก่อนอื่นต้องพูดให้เป็นธรรม สคริปต์พวกนี้เขียนมาดี เจตนาดี และบนเครื่องใหม่เอี่ยมที่ยังไม่มีอะไร มันช่วยประหยัดเวลาได้จริง ปัญหาไม่ได้อยู่ที่ตัวสคริปต์ แต่อยู่ที่ เรากำลังจะรันอะไรบางอย่างที่ไม่ได้อ่าน ด้วยสิทธิ์เต็มของตัวเอง บนเครื่องที่ตั้งค่าไว้แล้ว
พอเปิดอ่านสคริปต์ตัวที่เจอ สิ่งที่มันทำมีหลายอย่างที่กระทบเครื่องลึกกว่าที่คิด
- เขียน .zshrc ทับของเดิม มันติดตั้ง oh-my-zsh ซึ่งตอนลงจะเปลี่ยนชื่อ .zshrc เดิมเป็น
.zshrc.pre-oh-my-zshแล้ววางเทมเพลตของมันแทน แปลว่า PATH, alias และฟังก์ชันที่เราตั้งเองไว้ 108 บรรทัด จะไม่ถูกโหลดจนกว่าจะย้ายกลับเข้ามาเอง - เปลี่ยน default shell ด้วยคำสั่ง
chshและมีจุดที่ลบโฟลเดอร์ติดตั้งทิ้งด้วยrm -rfตอนจบ - ยัด runtime manager ซ้อนกันสามตัว (mise, fnm, pyenv) กับ prompt สองชั้น (oh-my-zsh บวก starship) ซึ่งชนกันเองและทำให้ shell เปิดช้า
- ดึงสคริปต์อื่นมารันต่ออีกทอด เช่นตัวติดตั้ง Homebrew ก็เป็น curl เข้า bash อีกชั้น
ไม่มีอะไรในนี้ที่ "อันตราย" ในความหมายว่าจงใจร้าย แต่รวมๆ แล้วมันคือการยกเครื่องตั้งค่า shell ของเราใหม่ทั้งหมด โดยที่ถ้าไม่เปิดอ่านก่อน ก็จะไม่มีทางรู้เลยว่ากำลังจะเสียอะไรไป
สคริปต์ที่ curl เข้า bash รันด้วยสิทธิ์ของคุณ และแก้อะไรในเครื่องก็ได้ การกดรันโดยไม่อ่าน คือการเซ็นเช็คเปล่าให้คนแปลกหน้า
ช่วงที่ 2กฎกันพลาด: อ่านก่อนรัน เลือกก่อนเทหมด
บทเรียนตรงนี้เป็นเรื่องเดียวกับที่เขียนไว้ในโพสต์เรื่องระบบความจำ AI ที่ข้อมูลหายเงียบ คือ รู้ว่าเครื่องมือที่เราปล่อยให้แตะของเรา มันทำอะไรกับของเราบ้าง ในกรณีนี้ "ของเรา" คือทั้งเครื่อง
กฎที่ใช้มีแค่สองข้อ ไม่ได้ซับซ้อน
- อ่านก่อนรันเสมอ โดยเฉพาะอะไรที่ curl เข้า bash แทนที่จะ pipe เข้า bash ตรงๆ ให้ save สคริปต์ลงไฟล์ก่อน เปิดอ่านว่ามันแตะอะไร แล้วค่อยรันไฟล์นั้น ใช้เวลาเพิ่มไม่กี่นาที แต่เปลี่ยนจาก "เชื่อสุดใจ" เป็น "เห็นแล้วว่าโอเค"
- เลือกก่อนเทหมด บนเครื่องที่ตั้งค่าไว้แล้ว การลงทีละชิ้นที่เรารู้ว่าต้องการ ดีกว่าเทแพ็กเกจสำเร็จรูปทั้งก้อน เพราะสคริปต์รวมมักมาพร้อมของที่เราไม่ได้ใช้และตัวที่ชนกับ config เดิม
ไม่ใช่ความหวาดระแวง เครื่องใหม่เอี่ยมจะรันสคริปต์รวดเดียวก็ได้ ความเสี่ยงต่ำ แต่พอเป็นเครื่องที่มี dotfiles และฟังก์ชันที่สร้างมาเป็นปีแล้ว การอ่านก่อนกับการเลือกลงเอง คือส่วนต่างระหว่างได้เครื่องมือใหม่ กับพังของเดิมที่ใช้อยู่
ช่วงที่ 3วิธีประกอบเองที่เราใช้
พอเลือกทางประกอบเอง มันไม่ได้ยุ่งยากอย่างที่กลัว แค่ทำเป็นขั้น และทุกขั้นมองเห็นว่าเกิดอะไรขึ้น
1. ลงเครื่องมือทีละตัวผ่าน brew
เลือกชุดที่คุ้มและไม่ล้น ลงผ่าน Homebrew ตัวเดียวจบต่อคำสั่ง จะได้รู้ว่ามีอะไรอยู่ในเครื่องบ้าง
brew install eza bat fd ripgrep zoxide starship fzf \
zsh-autosuggestions zsh-syntax-highlighting
ezaแทนls·batแทนcat·fdแทนfind·ripgrepแทนgrepzoxideจำไดเรกทอรีที่เคยไป แล้วกระโดดด้วยz·fzfค้นแบบ fuzzystarshipเป็น prompt (เบา ข้ามภาษา) ส่วนสองตัวท้ายคือ autosuggestions กับ syntax-highlighting
อยากได้ history ที่ค้นและ sync ได้ ค่อยเพิ่ม atuin ทีหลัง ไม่ต้องมีตั้งแต่แรก
2. ตั้งค่า Ghostty เป็นไฟล์เดียว
Ghostty อ่านไฟล์เดียวที่ ~/.config/ghostty/config เป็นข้อความ key = value ตรงๆ เก็บใน dotfiles/git แล้วก๊อปข้ามเครื่องได้ทันที
theme = catppuccin-mocha
font-family = "JetBrainsMono Nerd Font Mono"
font-size = 14
macos-option-as-alt = true
บรรทัด macos-option-as-alt จำเป็นถ้าอยากให้คีย์ลัดแบบ Alt (เช่นของ fzf) ทำงานบน Mac ส่วนฟอนต์ต้องเป็น Nerd Font ไอคอนใน prompt ถึงจะโชว์
3. ต่อ .zshrc เป็น block ที่ถอดกลับได้ (สำรองก่อนเสมอ)
หัวใจของการประกอบเองอยู่ตรงนี้ แทนที่จะให้ใครมาเขียน .zshrc ให้ใหม่ เรา สำรองไฟล์เดิมไว้ก่อน แล้วต่อของใหม่เป็นบล็อกที่มีป้ายกำกับ ลบออกเมื่อไหร่ก็กลับสภาพเดิม
cp ~/.zshrc ~/.zshrc.bak-$(date +%F) # สำรองก่อน
# --- curated modern-cli (ลบทั้งบล็อกนี้เพื่อย้อนกลับ) ---
eval "$(starship init zsh)"
eval "$(zoxide init zsh)"
alias ls='eza --icons=auto --group-directories-first'
alias cat='bat'
source /opt/homebrew/share/zsh-autosuggestions/zsh-autosuggestions.zsh
# syntax-highlighting ต้อง source เป็นบรรทัดท้ายสุด
source /opt/homebrew/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# --- end ---
สองอย่างที่ต้องระวัง หนึ่ง syntax-highlighting ต้องอยู่ท้ายสุดหลัง plugin อื่นทั้งหมด สอง ต่อบล็อกไว้ท้ายไฟล์ ของเดิมที่อยู่ข้างบน (PATH, ฟังก์ชันที่ตั้งเอง) ยังอยู่ครบ ไม่โดนแตะ
ผลลัพธ์เหมือนกับที่สคริปต์รวมสัญญาไว้ ทั้ง prompt สวย ทั้งเครื่องมือครบ แต่ได้มาแบบที่รู้ว่ามีอะไรบ้าง และย้อนกลับได้ทุกขั้น
สรุปกฎเดียวที่อยากให้จำ
ถ้าจะจำอย่างเดียวจากบทความนี้ อะไรที่จะ curl เข้า bash ให้เปิดอ่านก่อน และบนเครื่องที่ตั้งค่าไว้แล้ว เลือกลงเองทีละชิ้นดีกว่าเทสคริปต์รวมทั้งก้อน ความสะดวกของคำสั่งเดียวจบ ไม่คุ้มกับการเสีย config ที่สร้างมาทั้งปี
- Ghostty vs iTerm2 vs Terminal ตัวไหนดีที่สุด ที่มาว่าทำไมถึงเลือก Ghostty มาตั้งค่าตัวนี้
- ตัวกรองความปลอดภัยที่ลบข้อมูลเงียบๆ หลักเดียวกัน รู้ว่าเครื่องมือที่เราใช้ทำอะไรกับของเราบ้าง
- ทั้งหมดมาจากการตั้งค่าเครื่องตัวเองจริงในสัปดาห์นี้ (macOS, Ghostty, zsh) รวมถึงการเปิดอ่านสคริปต์ติดตั้งก่อนตัดสินใจไม่รัน
- สคริปต์ "คำสั่งเดียวจบ" ที่อ้างถึงคือแนวเดียวกับ dev-accelerator (dev.to) ที่รวม Ghostty, Zsh, oh-my-zsh, starship และเครื่องมืออีกหลายสิบตัวเป็นสคริปต์เดียว
- Oh My Zsh, Basic installation (ตัวติดตั้งสำรอง .zshrc เดิมเป็น .zshrc.pre-oh-my-zsh แล้ววางเทมเพลตของมัน)
- Ghostty, Configuration (ไฟล์ config เดียว รูปแบบ key = value)