feat(vps-xray): 新增 update_env_field 就地更新 .env 单个字段
This commit is contained in:
@@ -127,6 +127,23 @@ resolve_restart_config() {
|
||||
return 0
|
||||
}
|
||||
|
||||
# 就地更新 .env 中的单个字段:存在则替换,不存在则追加。
|
||||
# 刻意不复用 save_env——后者是 cat > 全量重写,会抹掉用户自己加的注释与字段;
|
||||
# 轻量入口只该改自己那一行。
|
||||
update_env_field() {
|
||||
local file="$1" key="$2" value="$3" esc
|
||||
[ -f "$file" ] || return 1
|
||||
|
||||
if grep -q "^${key}=" "$file"; then
|
||||
# 用 | 作分隔符,并转义 value 中的 | & \,避免值里的 / 破坏 sed
|
||||
esc=$(printf '%s' "$value" | sed 's/[|&\\]/\\&/g')
|
||||
sed -i "s|^${key}=.*|${key}=${esc}|" "$file"
|
||||
else
|
||||
printf '%s=%s\n' "$key" "$value" >> "$file"
|
||||
fi
|
||||
return 0
|
||||
}
|
||||
|
||||
resolve_restart_config || exit 1
|
||||
|
||||
# 过渡兼容:harden_system / start_service / save_env 仍引用 DAILY_RESTART,
|
||||
|
||||
@@ -105,6 +105,40 @@ reset_env; XRAY_RESTART_TIMEZONE=""
|
||||
resolve_restart_config 2>/dev/null
|
||||
is "时区空串报错" "$?" "1"
|
||||
|
||||
echo "== update_env_field =="
|
||||
|
||||
TMP="$(mktemp -d)"
|
||||
trap 'rm -rf "$TMP"' EXIT
|
||||
|
||||
cat > "${TMP}/.env" << 'ENVEOF'
|
||||
# 这是用户自己加的注释
|
||||
XRAY_PORT=443
|
||||
XRAY_RESTART_EVERY_DAYS=0
|
||||
# 尾部注释
|
||||
ENVEOF
|
||||
|
||||
update_env_field "${TMP}/.env" XRAY_RESTART_EVERY_DAYS 7
|
||||
is "替换已有字段" "$(grep '^XRAY_RESTART_EVERY_DAYS=' "${TMP}/.env")" "XRAY_RESTART_EVERY_DAYS=7"
|
||||
is "保留用户注释" "$(grep -c '这是用户自己加的注释' "${TMP}/.env")" "1"
|
||||
is "保留尾部注释" "$(grep -c '尾部注释' "${TMP}/.env")" "1"
|
||||
is "不影响其它字段" "$(grep '^XRAY_PORT=' "${TMP}/.env")" "XRAY_PORT=443"
|
||||
|
||||
update_env_field "${TMP}/.env" XRAY_RESTART_TIME 05:30
|
||||
is "追加缺失字段" "$(grep '^XRAY_RESTART_TIME=' "${TMP}/.env")" "XRAY_RESTART_TIME=05:30"
|
||||
|
||||
update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Asia/Shanghai
|
||||
is "含斜杠的值不被 sed 分隔符干扰" \
|
||||
"$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Asia/Shanghai"
|
||||
|
||||
update_env_field "${TMP}/.env" XRAY_RESTART_TIMEZONE Europe/Berlin
|
||||
is "含斜杠的值可被再次替换" \
|
||||
"$(grep '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "XRAY_RESTART_TIMEZONE=Europe/Berlin"
|
||||
|
||||
is "字段总行数正确" "$(grep -c '^XRAY_RESTART_TIMEZONE=' "${TMP}/.env")" "1"
|
||||
|
||||
update_env_field "${TMP}/nonexistent" FOO bar 2>/dev/null
|
||||
is "文件不存在返回 1" "$?" "1"
|
||||
|
||||
echo ""
|
||||
echo "通过 ${PASS},失败 ${FAIL}"
|
||||
[ "$FAIL" -eq 0 ]
|
||||
|
||||
Reference in New Issue
Block a user