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:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user