122 lines
3.5 KiB
Bash
Executable File
122 lines
3.5 KiB
Bash
Executable File
#!/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}"
|