doc(linux): Add linux client install.sh & uninstall.sh
This commit is contained in:
121
linux/uninstall.sh
Executable file
121
linux/uninstall.sh
Executable file
@@ -0,0 +1,121 @@
|
||||
#!/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}"
|
||||
Reference in New Issue
Block a user