เมื่อพื้นที่ฮาร์ดดิสก์บน macOS หรือ Linux เหลือเพียงไม่กี่กิกะไบต์ การรันคำสั่ง brew upgrade ตามปกติมักจะล้มเหลวกลางคัน เนื่องจากระบบจะพยายามดาวน์โหลดไฟล์ติดตั้ง (.bottle/tarball) ของทุกแพ็กเกจลงมาในแคชพร้อมกัน และยังเก็บไฟล์เวอร์ชันเก่าไว้จนกว่าจะอัปเกรดเสร็จสิ้นทั้งหมด
ทางออกคือการรันอัปเกรดทีละแพ็กเกจ (Sequential Upgrade) พร้อมสั่งยืนยันตอบ y ล่วงหน้า และล้างแคช (brew cleanup) ทิ้งทันทีในแต่ละรอบ
ปัญหาที่ต้องจัดการในสคริปต์
- โต้ตอบยืนยันอัตโนมัติ: บางแพ็กเกจหรือขั้นตอนมีข้อความแจ้งเตือน
Do you want to proceed with the upgrade? [y/n]ซึ่งแก้ได้ด้วยการใช้ตัวแปรNONINTERACTIVE=1ของ Homebrew หรือไพพ์คำสั่งyesเข้าไป - ขยะสะสมระหว่างลูป: หากไม่อ้างอิงคำสั่งลบแคชไฟล์
.bottleที่โหลดมาจะค้างอยู่ในโฟลเดอร์ Cache ตลอดเวลา - การแยกประเภท Formula และ Cask: แยกการทำงานให้ชัดเจนเพื่อป้องกันข้อผิดพลาดจาก GUI Apps
Bash Script: Smart Auto-Upgrade & Cache Purge
บันทึกโค้ดด้านล่างเป็นไฟล์ brew_smart_upgrade.sh หรือนำไปรันใน Terminal ได้ทันที
#!/usr/bin/env bash
set -uo pipefail
export NONINTERACTIVE=1
export HOMEBREW_NO_ENV_HINTS=1
export HOMEBREW_NO_AUTO_UPDATE=1
SUCCESS_LIST=()
FAILED_LIST=()
cleanup_space() {
local target="${1:-}"
if [ -n "$target" ]; then
brew cleanup --prune=all -s "$target" > /dev/null 2>&1 || true
else
brew cleanup --prune=all -s > /dev/null 2>&1 || true
fi
rm -rf "$(brew --cache)" 2>/dev/null || true
# เคลียร์ incomplete download locks ที่ตกค้างจากดิสก์เต็ม
rm -f /opt/homebrew/var/homebrew/locks/*.incomplete.* 2>/dev/null || true
rm -f /usr/local/var/homebrew/locks/*.incomplete.* 2>/dev/null || true
}
echo "=================================================="
echo "📊 ข้อมูลพื้นที่ดิสก์ปัจจุบัน:"
df -h / | awk 'NR==1 || NR==2'
echo "=================================================="
echo "==> [1/4] เคลียร์พื้นที่แคชและ Lock files เริ่มต้น..."
cleanup_space
echo "==> [2/4] อัปเดตฐานข้อมูล Homebrew..."
brew update || echo "⚠️ คำเตือน: ไม่สามารถ brew update ได้ครบถ้วน"
# ดึงรายการ Formula ที่ต้องอัปเกรด
OUTDATED_FORMULAS=$(brew outdated --formula --quiet 2>/dev/null || true)
echo "==> [3/4] กำลังอัปเกรด Formulas ทีละตัว..."
if [ -n "$OUTDATED_FORMULAS" ]; then
for pkg in $OUTDATED_FORMULAS; do
echo "--------------------------------------------------"
echo "⚙️ กำลังจัดการ Formula: $pkg"
if brew upgrade "$pkg"; then
SUCCESS_LIST+=("Formula: $pkg")
else
echo "❌ ล้มเหลว: $pkg (พื้นที่อาจไม่พอ)"
FAILED_LIST+=("Formula: $pkg")
fi
cleanup_space "$pkg"
done
else
echo "ไม่มี Formula ที่ต้องอัปเกรด"
fi
# ดึงรายการ Cask ที่ต้องอัปเกรด
OUTDATED_CASKS=$(brew outdated --cask --quiet 2>/dev/null || true)
echo "==> [4/4] กำลังอัปเกรด Casks ทีละตัว..."
if [ -n "$OUTDATED_CASKS" ]; then
for cask in $OUTDATED_CASKS; do
echo "--------------------------------------------------"
echo "📦 กำลังจัดการ Cask: $cask"
if brew upgrade --cask "$cask"; then
SUCCESS_LIST+=("Cask: $cask")
else
echo "❌ ล้มเหลว: $cask (พื้นที่อาจไม่พอ)"
FAILED_LIST+=("Cask: $cask")
fi
cleanup_space "$cask"
done
else
echo "ไม่มี Cask ที่ต้องอัปเกรด"
fi
echo ""
echo "=================================================="
echo "📋 สรุปรายงานผลการทำงาน (Summary Report)"
echo "=================================================="
if [ ${#SUCCESS_LIST[@]} -gt 0 ]; then
echo "✅ สำเร็จ (${#SUCCESS_LIST[@]} รายการ):"
for item in "${SUCCESS_LIST[@]}"; do
echo " ✔ $item"
done
fi
if [ ${#FAILED_LIST[@]} -gt 0 ]; then
echo ""
echo "❌ ล้มเหลว / ข้าม (${#FAILED_LIST[@]} รายการ):"
for item in "${FAILED_LIST[@]}"; do
echo " ✖ $item"
done
echo ""
echo "💡 คำแนะนำ: ตรวจสอบและเคลียร์พื้นที่ว่างในเครื่อง (แนะนำให้เหลืออย่างน้อย 5-10 GB สำหรับ Cask ขนาดใหญ่)"
fi
echo "--------------------------------------------------"
echo "📊 พื้นที่ดิสก์หลังจบการทำงาน:"
df -h / | awk 'NR==1 || NR==2'
echo "=================================================="
วิธีนำไปใช้งาน
- กำหนดสิทธิ์และรันไฟล์
chmod +x brew_smart_upgrade.sh
./brew_smart_upgrade.sh - หรือรันเป็นคำสั่งสั้นแบบ One-liner (สำหรับ Formula)
หากไม่ต้องการสร้างไฟล์สคริปต์ สามารถก๊อบปี้คำสั่งนี้ไปรันในเทอร์มินัลได้ทันทีexport NONINTERACTIVE=1; brew update && for pkg in $(brew outdated --formula --quiet); do yes | brew upgrade "$pkg"; brew cleanup --prune=all -s; rm -rf "$(brew --cache)"; done
กลไกการทำงานของคำสั่งสำคัญ
export NONINTERACTIVE=1&yes |: บังคับให้ Homebrew และระบบ CLI ตอบรับค่าเริ่มต้น (ส่วนใหญ่คือ Yes/Confirm) โดยไม่ต้องรอให้ผู้ใช้กดปุ่มบนคีย์บอร์ดbrew cleanup --prune=all -s: คำสั่งลบเวอร์ชันเก่าที่ถูกแทนที่ทันที พร้อมล้าง Logs และ Lock files ทั้งหมด (-sหรือ--scrubช่วยล้างไฟล์ที่ถูกดึงมาเกินความจำเป็น)rm -rf "$(brew --cache)": ลบไฟล์บิลด์และตัวดาวน์โหลด.tar.gzหรือ.dmgออกจากเครื่องทันทีหลังการติดตั้งเสร็จในแต่ละลูป ทำให้พื้นที่ว่างพร้อมใช้งานสำหรับแพ็กเกจถัดไปเสมอ
อ่านเพิ่มเติม