From 47c73ac3638f878f56ea078467f617258af49d12 Mon Sep 17 00:00:00 2001 From: wnlen <62139570+wnlen@users.noreply.github.com> Date: Fri, 20 Mar 2026 17:25:44 +0800 Subject: [PATCH] Update clashctl --- clashctl | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/clashctl b/clashctl index a24c179..857bdd4 100755 --- a/clashctl +++ b/clashctl @@ -1,7 +1,48 @@ #!/usr/bin/env bash set -euo pipefail -PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +resolve_project_dir() { + # 1) 显式指定优先 + if [ -n "${CLASH_INSTALL_DIR:-}" ] && [ -d "${CLASH_INSTALL_DIR:-}" ]; then + printf '%s\n' "$CLASH_INSTALL_DIR" + return 0 + fi + + # 2) 解析脚本真实路径(兼容软链/安装到 /usr/local/bin) + local src dir + src="${BASH_SOURCE[0]}" + + while [ -L "$src" ]; do + dir="$(cd -P "$(dirname "$src")" && pwd)" + src="$(readlink "$src")" + [[ "$src" != /* ]] && src="$dir/$src" + done + + dir="$(cd -P "$(dirname "$src")" && pwd)" + + # 如果 clashctl 就在项目根目录 + if [ -f "$dir/scripts/service_lib.sh" ]; then + printf '%s\n' "$dir" + return 0 + fi + + # 3) 常见安装目录兜底 + for candidate in \ + "/opt/clash-for-linux" \ + "$HOME/clash-for-linux" \ + "/root/clash-for-linux" + do + if [ -f "$candidate/scripts/service_lib.sh" ]; then + printf '%s\n' "$candidate" + return 0 + fi + done + + echo "[ERROR] Unable to locate project directory" >&2 + exit 1 +} + +PROJECT_DIR="$(resolve_project_dir)" SERVICE_NAME="clash-for-linux.service" PROFILED_FILE="/etc/profile.d/clash-for-linux.sh" ENV_FILE="$PROJECT_DIR/.env"