fix(homebrew): 修复 Homebrew 伪终端输入和输出处理问题

- 在 colorize_line 函数中处理光标控制序列,避免它们破坏版本着色
- 添加 run_brew_in_pseudoterminal 函数,从控制终端读取输入而不是关闭的管道
- 将主脚本通过 curl 管道启动时的输入重定向到 /dev/tty
- 修复启动器中 sudo 密码读取时的输入源问题
- 更新文档说明启动器如何处理 curl 管道输入和确认提示
This commit is contained in:
2026-07-24 08:54:53 +08:00
parent 8124810b6e
commit 15d18f6123
3 changed files with 43 additions and 5 deletions
+12 -2
View File
@@ -107,7 +107,11 @@ EOF
if ! /usr/bin/security find-generic-password -a "$CURRENT_USER" -s "$KEYCHAIN_SERVICE" -w >/dev/null 2>&1; then
printf '%b首次使用:请输入一次 sudo 密码,将保存到 macOS Keychain%b' "$YELLOW" "$NC"
IFS= read -r -s BREWUP_SUDO_PASSWORD
if [[ -r /dev/tty ]]; then
IFS= read -r -s BREWUP_SUDO_PASSWORD < /dev/tty
else
IFS= read -r -s BREWUP_SUDO_PASSWORD
fi
printf '\n'
/usr/bin/security add-generic-password -U -a "$CURRENT_USER" -s "$KEYCHAIN_SERVICE" -w "$BREWUP_SUDO_PASSWORD" >/dev/null
unset BREWUP_SUDO_PASSWORD
@@ -125,4 +129,10 @@ EOF
setup_sudo_askpass
export COLUMNS="${COLUMNS:-130}"
bash "$TEMP" "$@"
if [[ -r /dev/tty ]]; then
# 启动器是通过 curl 管道执行时,不让主脚本继承已关闭的管道输入。
# 这样 Homebrew 的确认提示和 script(1) 的伪终端都能从当前终端正常读取输入。
bash "$TEMP" "$@" < /dev/tty
else
bash "$TEMP" "$@"
fi