Skip to content

[BUG修复] start.sh 存在多个严重Bug,需要紧急修复 #36

@SonicBotMan

Description

@SonicBotMan

📋 本 Issue 由 Claude Sonnet 4.6 自动分析生成,包含完整的问题描述和可直接复制使用的修复代码。


问题总览

start.sh 中存在 4个严重Bug2个设计逻辑问题,会导致脚本在大多数情况下无法正常工作。以下是逐一说明和修复方案。


🔴 Bug 1:SCRIPT_DIR 变量未定义(最严重)

问题位置

start.sh 第 54 行附近:

# ❌ 错误代码:SCRIPT_DIR 从未被赋值!
if [ -f "$SCRIPT_DIR/start.sh" ] && [ -d "$SCRIPT_DIR/node" ] && [ -d "$SCRIPT_DIR/npm-global" ]; then

问题说明

$SCRIPT_DIR 是一个空变量,所以这个判断永远是 false,导致「检测当前目录」的逻辑完全失效。如果用户直接双击运行 start.sh(不是从 /media 路径),脚本会报错「未检测到 U盘」。

✅ 修复方案

在脚本顶部set -e 之后)加入这一行:

# 在 set -e 之后立即加入
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

🔴 Bug 2:export HOME="$TEMP_DIR" 会污染当前终端环境

问题位置

start.sh 底部启动段:

# ❌ 危险操作:会影响整个当前终端会话的所有命令
export HOME="$TEMP_DIR"

问题说明

HOME 是操作系统最核心的环境变量之一。把它改掉以后:

  • 同一个终端窗口里,~/.ssh~/.gitconfig~/.zshrc 等全部会指向临时目录
  • 运行 stop.sh 之后这个变量不会自动恢复,必须关闭终端才行
  • 这与项目「零痕迹」的核心理念完全矛盾

✅ 修复方案

用 OpenClaw 专属的环境变量来代替,避免修改系统 HOME

# ✅ 正确做法:用专属变量,不动系统 HOME
export OPENCLAW_HOME="$TEMP_DIR"
export XDG_CONFIG_HOME="$TEMP_DIR/.config"
export XDG_DATA_HOME="$TEMP_DIR/.local/share"
# 删除这行:export HOME="$TEMP_DIR"

注意:同时需要检查 OpenClaw 自身是否支持 OPENCLAW_HOME 环境变量,如果不支持,可以在启动时用 --config 参数指定配置目录。


🟠 Bug 3:sudo apt-get install git 在非 Ubuntu/公共电脑上会失败

问题位置

# ❌ 问题代码
if ! command -v git &> /dev/null; then
    echo -e "${YELLOW}⚠️  Git 未安装,正在安装...${NC}"
    sudo apt-get update && sudo apt-get install -y git
fi

问题说明

  1. 在 macOS、Fedora、Arch Linux 上根本没有 apt-get,会直接报错
  2. 在公司/公共电脑上通常没有 sudo 权限,会卡住要密码
  3. sudo apt-get install 会在系统留下安装记录,破坏「零痕迹」承诺

✅ 修复方案

改为检测多种包管理器,并且在没权限时优雅提示而不是强行安装:

# ✅ 正确做法:多包管理器支持 + 无权限时优雅提示
if ! command -v git &> /dev/null; then
    echo -e "${YELLOW}⚠️  Git 未安装,尝试自动安装...${NC}"
    
    if command -v apt-get &> /dev/null; then
        sudo apt-get install -y git 2>/dev/null || true
    elif command -v yum &> /dev/null; then
        sudo yum install -y git 2>/dev/null || true
    elif command -v brew &> /dev/null; then
        brew install git 2>/dev/null || true
    fi
    
    # 再检查一次,如果还没有就告诉用户手动装
    if ! command -v git &> /dev/null; then
        echo -e "${YELLOW}⚠️  Git 自动安装失败,部分功能可能受限${NC}"
        echo -e "${YELLOW}    请手动安装 Git: https://git-scm.com/downloads${NC}"
        echo -e "${YELLOW}    基本 AI 对话功能不受影响,继续启动...${NC}"
        # 不要 exit 1,继续启动
    fi
fi

🟠 Bug 4:set -e|| true 混用导致错误处理混乱

问题说明

脚本开头写了 set -e(任何命令出错就退出),但后面又大量用 2>/dev/null || true 来忽略错误。这两种模式混在一起,行为很难预测,某些你想让它失败退出的步骤反而会被吞掉继续执行。

✅ 修复方案

两种方式选一种,统一风格:

方案 A(推荐):删掉 set -e,每个重要步骤手动检查:

# 删除脚本顶部的 set -e
# 对关键步骤手动加错误检查
if ! openclaw gateway start; then
    echo -e "${RED}❌ OpenClaw 启动失败!${NC}"
    exit 1
fi

方案 B:保留 set -e,但对「允许失败」的命令统一用 || true,对「必须成功」的命令不加 || true


🟡 设计问题 1:「自动同步」实际上是粗暴覆盖

现状

# 这不是「同步」,这是直接覆盖,新电脑的数据会被U盘数据覆盖
cp -r "$DATA_DIR/.openclaw/"* "$TEMP_DIR/" 2>/dev/null || true

建议

如果要实现真正的「双向同步」,推荐使用 rsync(大多数 Linux/macOS 自带):

# 使用 rsync 进行真正的增量同步(不覆盖比U盘更新的文件)
if command -v rsync &> /dev/null; then
    rsync -av --update "$DATA_DIR/.openclaw/" "$TEMP_DIR/"
else
    # rsync 不可用时退回到 cp,并提示用户
    cp -r "$DATA_DIR/.openclaw/"* "$TEMP_DIR/" 2>/dev/null || true
    echo -e "${YELLOW}⚠️  rsync 不可用,使用基础复制模式(数据可能被覆盖)${NC}"
fi

🟡 设计问题 2:README 「完全离线」宣传不准确

README 多处宣传「完全离线」,但:

  • OpenClaw 调用 AI 模型必须联网(这是 AI 网关的本质)
  • README 自己也承认「仅 Git 需网络」

建议把「完全离线」改为「运行环境完全离线(无需安装,无需下载),AI 对话功能需要网络连接 AI 服务」,这样更准确,避免用户误解。


修复后的 start.sh 完整关键段落

下面是修复后的完整关键代码段,可以直接替换:

#!/bin/bash
# OpenClaw Portable - 智能启动脚本(修复版)

# ✅ Fix 1: 立即定义 SCRIPT_DIR
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

# ✅ Fix 4: 去掉 set -e,改为手动错误处理
# set -e  <-- 删除这行

# ... 颜色变量定义保持不变 ...

# ============================================
# 检测 U盘(当前目录检测逻辑现在可以正常工作)
# ============================================
if [ -f "$SCRIPT_DIR/start.sh" ] && [ -d "$SCRIPT_DIR/node" ] && [ -d "$SCRIPT_DIR/npm-global" ]; then
    # SCRIPT_DIR 已正确定义,这段逻辑现在能正常执行
    FOUND=0
    for usb in "${USB_LIST[@]}"; do
        if [ "$usb" == "$SCRIPT_DIR" ]; then
            FOUND=1
            break
        fi
    done
    if [ $FOUND -eq 0 ]; then
        USB_COUNT=$((USB_COUNT + 1))
        USB_LIST+=("$SCRIPT_DIR")
        echo -e "  ${GREEN}[$USB_COUNT]${NC} $SCRIPT_DIR (当前目录)"
    fi
fi

# ============================================
# ✅ Fix 3: Git 检测(多平台 + 优雅失败)
# ============================================
if ! command -v git &> /dev/null; then
    echo -e "${YELLOW}⚠️  Git 未安装,尝试自动安装...${NC}"
    if command -v apt-get &> /dev/null; then
        sudo apt-get install -y git 2>/dev/null || true
    elif command -v yum &> /dev/null; then
        sudo yum install -y git 2>/dev/null || true  
    elif command -v brew &> /dev/null; then
        brew install git 2>/dev/null || true
    fi
    if ! command -v git &> /dev/null; then
        echo -e "${YELLOW}⚠️  Git 未安装,基础功能不受影响,继续启动...${NC}"
    fi
fi

# ============================================
# ✅ Fix 2: 启动时不修改 HOME
# ============================================
export OPENCLAW_WORKSPACE="$WORKSPACE_DIR"
export OPENCLAW_CONFIG_DIR="$TEMP_DIR"
export XDG_CONFIG_HOME="$TEMP_DIR/.config"
export XDG_DATA_HOME="$TEMP_DIR/.local/share"
# ❌ 删除这行: export HOME="$TEMP_DIR"

优先级总结

优先级 Bug 影响
🔴 立刻修 SCRIPT_DIR 未定义 当前目录检测完全失效
🔴 立刻修 export HOME 覆盖 污染用户终端环境
🟠 尽快修 Git 安装逻辑 macOS/非Ubuntu系统报错
🟠 尽快修 set -e 混用 错误处理不可靠
🟡 建议改 同步逻辑 数据可能被意外覆盖
🟡 建议改 README 措辞 用户对「离线」产生误解

希望这些修复对你有帮助!如果有任何问题,欢迎回复讨论。🙌


— Reviewed by Claude Sonnet 4.6

Metadata

Metadata

Assignees

No one assigned

    Labels

    bug🐛 Bug - Something isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions