วัน: 28 สิงหาคม 2026

Homebrew: อัปเกรด ทีละตัวอัตโนมัติบนเครื่องพื้นที่จำกัด (Low Disk Space)Homebrew: อัปเกรด ทีละตัวอัตโนมัติบนเครื่องพื้นที่จำกัด (Low Disk Space)

เมื่อพื้นที่ฮาร์ดดิสก์บน macOS หรือ Linux เหลือเพียงไม่กี่กิกะไบต์ การรันคำสั่ง brew upgrade ตามปกติมักจะล้มเหลวกลางคัน เนื่องจากระบบจะพยายามดาวน์โหลดไฟล์ติดตั้ง (.bottle/tarball) ของทุกแพ็กเกจลงมาในแคชพร้อมกัน และยังเก็บไฟล์เวอร์ชันเก่าไว้จนกว่าจะอัปเกรดเสร็จสิ้นทั้งหมด

ทางออกคือการรันอัปเกรดทีละแพ็กเกจ (Sequential Upgrade) พร้อมสั่งยืนยันตอบ y ล่วงหน้า และล้างแคช (brew cleanup) ทิ้งทันทีในแต่ละรอบ


ปัญหาที่ต้องจัดการในสคริปต์

  1. โต้ตอบยืนยันอัตโนมัติ: บางแพ็กเกจหรือขั้นตอนมีข้อความแจ้งเตือน Do you want to proceed with the upgrade? [y/n] ซึ่งแก้ได้ด้วยการใช้ตัวแปร NONINTERACTIVE=1 ของ Homebrew หรือไพพ์คำสั่ง yes เข้าไป
  2. ขยะสะสมระหว่างลูป: หากไม่อ้างอิงคำสั่งลบแคชไฟล์ .bottle ที่โหลดมาจะค้างอยู่ในโฟลเดอร์ Cache ตลอดเวลา
  3. การแยกประเภท 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 "=================================================="

วิธีนำไปใช้งาน

  1. กำหนดสิทธิ์และรันไฟล์
    chmod +x brew_smart_upgrade.sh
    ./brew_smart_upgrade.sh
  2. หรือรันเป็นคำสั่งสั้นแบบ 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 ออกจากเครื่องทันทีหลังการติดตั้งเสร็จในแต่ละลูป ทำให้พื้นที่ว่างพร้อมใช้งานสำหรับแพ็กเกจถัดไปเสมอ

อ่านเพิ่มเติม