Fix curl-pipe-bash install menu on Linux.

Avoid unbound BASH_SOURCE under set -u, attach stdin to /dev/tty for interactive prompts, and handle empty menu input without looping.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-07-12 12:03:54 +08:00
parent f508f210f9
commit fa90a29576
2 changed files with 58 additions and 13 deletions
+22
View File
@@ -41,12 +41,25 @@ def _fail(msg: str) -> None:
def _pause() -> None:
if not sys.stdin.isatty():
return
try:
input("\n按回车返回菜单...")
except (EOFError, KeyboardInterrupt):
print()
def _require_tty(action: str) -> None:
if sys.stdin.isatty():
return
print(f"[FAIL] 当前环境无法交互式{action}stdin 不是终端)", file=sys.stderr)
print("请使用以下方式之一:", file=sys.stderr)
print(" bash scripts/install.sh", file=sys.stderr)
print(" python3 scripts/navctl.py install -y", file=sys.stderr)
print(" curl -fsSL .../install.sh | bash -s -- install -y", file=sys.stderr)
sys.exit(1)
def prompt_value(label: str, default: str) -> str:
try:
raw = input(f"{label} [{default}]: ").strip()
@@ -118,6 +131,8 @@ def run_deploy(project_dir: Path, py_exe: str) -> None:
def action_install(*, repo: str = "", dest: str = "", yes: bool = False) -> None:
if not yes:
_require_tty("安装")
print()
print("=" * 50)
print(" 一键部署安装")
@@ -168,6 +183,7 @@ def action_update(*, dest: str = "") -> None:
def action_uninstall(*, dest: str = "") -> None:
_require_tty("卸载")
print()
print("=" * 50)
print(" 一键卸载")
@@ -249,6 +265,7 @@ def render_menu(project_dir: Path | None) -> None:
def interactive_menu() -> None:
_require_tty("打开菜单")
print(f"LocalNav 部署管理 · {platform.system()} {platform.release()}")
while True:
project_dir = resolve_project_dir()
@@ -259,6 +276,11 @@ def interactive_menu() -> None:
print("\n再见。")
return
if not choice:
_warn("请输入 0-3")
_pause()
continue
if choice == "1":
try:
action_install()