#!/usr/bin/env bash # YAMA Ghost (Linux client) — uninstall # # 用法: # ./uninstall.sh # 默认从 ~/.local/bin/ghost 卸载 # ./uninstall.sh /opt/yama # 从指定目录卸载 # ./uninstall.sh --yes # 跳过确认(自动化场景) # # 行为(幂等 — 重复运行不会报错): # 1. 停止运行中的 ghost 进程 # 2. 删除 XDG Autostart 文件 # 3. 删除已安装的二进制 # 4. 询问是否清理用户配置(~/.config/ghost) set -euo pipefail # ---- 颜色 ---- if [[ -t 1 ]]; then C_RED=$'\033[31m'; C_GREEN=$'\033[32m'; C_YELLOW=$'\033[33m' C_BLUE=$'\033[34m'; C_BOLD=$'\033[1m'; C_RESET=$'\033[0m' else C_RED=''; C_GREEN=''; C_YELLOW=''; C_BLUE=''; C_BOLD=''; C_RESET='' fi info() { echo "${C_BLUE}[INFO]${C_RESET} $*"; } ok() { echo "${C_GREEN}[ OK ]${C_RESET} $*"; } warn() { echo "${C_YELLOW}[WARN]${C_RESET} $*"; } error() { echo "${C_RED}[FAIL]${C_RESET} $*" >&2; } # ---- 参数解析 ---- ASSUME_YES=0 INSTALL_DIR="${HOME}/.local/bin" for arg in "$@"; do case "${arg}" in --yes|-y) ASSUME_YES=1 ;; --help|-h) # 头部注释覆盖标题/用法/行为 4 步,对应源文件第 2-13 行 sed -n '2,13p' "$0" | sed 's/^# \?//' exit 0 ;; *) INSTALL_DIR="${arg}" ;; esac done DEST_BIN="${INSTALL_DIR}/ghost" AUTOSTART_FILE="${XDG_CONFIG_HOME:-${HOME}/.config}/autostart/ghost.desktop" CONFIG_DIR="${XDG_CONFIG_HOME:-${HOME}/.config}/ghost" confirm() { [[ "${ASSUME_YES}" -eq 1 ]] && return 0 local prompt="$1" local ans="" echo -n "${prompt} [y/N] " read -r ans || true # EOF on stdin: ans stays empty, 返回 no [[ "${ans}" =~ ^[Yy]$ ]] } echo "${C_BOLD}YAMA Ghost Linux 卸载${C_RESET}" echo " 二进制: ${DEST_BIN}" echo " 自启动: ${AUTOSTART_FILE}" echo " 配置: ${CONFIG_DIR}" echo "" if ! confirm "确认卸载?"; then info "已取消" exit 0 fi # ---- 1. 停止进程 ---- if pgrep -x ghost > /dev/null; then info "停止运行中的 ghost 进程" pkill -x ghost || true sleep 1 if pgrep -x ghost > /dev/null; then warn "进程未优雅退出,强制 kill" pkill -9 -x ghost || true sleep 1 fi ok "ghost 进程已停止" else info "没有运行中的 ghost 进程" fi # ---- 2. 删除 Autostart 文件 ---- if [[ -f "${AUTOSTART_FILE}" ]]; then rm -f "${AUTOSTART_FILE}" ok "已删除 ${AUTOSTART_FILE}" else info "Autostart 文件不存在(已卸载或未安装过)" fi # ---- 3. 删除二进制 ---- if [[ -f "${DEST_BIN}" ]]; then if [[ -w "${DEST_BIN}" ]] || [[ -w "$(dirname "${DEST_BIN}")" ]]; then rm -f "${DEST_BIN}" ok "已删除 ${DEST_BIN}" else info "需要 sudo 才能删除 ${DEST_BIN}" sudo rm -f "${DEST_BIN}" ok "已删除 ${DEST_BIN}" fi # 如果安装目录是 ~/.local/bin 且现在空了,不删除(可能用户还有其它东西) else info "二进制不存在(已卸载或不在 ${INSTALL_DIR})" fi # ---- 4. 用户配置目录(询问,不主动删)---- if [[ -d "${CONFIG_DIR}" ]]; then echo "" warn "用户配置目录仍存在:${CONFIG_DIR}" warn "其中可能包含 PID 文件、日志等。删除后无法恢复。" if confirm " 一并删除配置目录?"; then rm -rf "${CONFIG_DIR}" ok "已删除 ${CONFIG_DIR}" else info "保留配置目录" fi fi echo "" echo "${C_GREEN}${C_BOLD}✓ 卸载完成${C_RESET}"