來源:bear #52 全階段驗收的非阻塞建議 2(父追蹤項:bear #39)。
#52 驗收時發現:CLI 互動輸入(密碼等)在 stdin 非 TTY 時,Erlang 的 :io.rows() 回 enotsup(本機 escript 環境重現),導致無法直接讀 stdin 密碼,需經官方測試注入介面(opts[:io])繞過。功能面不受影響(驗收以注入介面完成全流程),但非互動環境(CI、管道、腳本)可用性受損。
:io.rows()
enotsup
opts[:io]
改善 stdin 互動偵測:不再只依賴 :io.rows(),可考慮偵測 /dev/tty 存在性或其他跨平台方式,讓非 TTY 環境下能正確判定可否互動、給出明確錯誤或改用注入介面。
/dev/tty
vault unlock
mix precommit
收到,開始處理:改善 stdin 互動偵測,不再只依賴 :io.rows(),讓非 TTY 環境(CI/管道)下 vault 互動指令有可預期行為(明確提示或走注入介面),並補測試、跑 mix precommit 全綠。
vault
已完成修正,PR #20(分支 fix/vault-non-tty-stdin,commit a29b976)待審核。
fix/vault-non-tty-stdin
根因::io.rows/0/:io.columns/0 走 io 協定詢問 group leader,escript(erl -noshell 的 standard_io)不支援行列查詢、一律回 enotsup——真終端機被誤判成非 TTY,vault unlock 等互動指令直接報「請在終端機執行」。
:io.rows/0
:io.columns/0
erl -noshell
standard_io
修正:新增 BearCli.TTY,改 readlink /proc/self/fd/0 判定 fd 0 實際裝置(/dev/pts/*、/dev/tty*、/dev/console、/dev/ptmx = TTY;pipe/檔案/socket 非 TTY);無 /proc 平台退回 :io.rows/0。vault/self_service/accounts 三處偵測點統一改用。非 TTY 行為不變(明確提示+退出碼 2,不崩潰)。
BearCli.TTY
/proc/self/fd/0
/dev/pts/*
/dev/tty*
/dev/console
/dev/ptmx
/proc
self_service
accounts
驗收對應:
</dev/null
issue 依流程保留待審核後關閉。
PR #20 已驗證符合本 issue 要求並合併(merge commit 41c30155),關閉本 issue。
審核驗證(獨立重跑):
No dependencies set.
The note is not visible to the blocked user.
來源:bear #52 全階段驗收的非阻塞建議 2(父追蹤項:bear #39)。
背景
#52 驗收時發現:CLI 互動輸入(密碼等)在 stdin 非 TTY 時,Erlang 的
:io.rows()回enotsup(本機 escript 環境重現),導致無法直接讀 stdin 密碼,需經官方測試注入介面(opts[:io])繞過。功能面不受影響(驗收以注入介面完成全流程),但非互動環境(CI、管道、腳本)可用性受損。工作
改善 stdin 互動偵測:不再只依賴
:io.rows(),可考慮偵測/dev/tty存在性或其他跨平台方式,讓非 TTY 環境下能正確判定可否互動、給出明確錯誤或改用注入介面。驗收
vault unlock等互動指令,行為可預期:可互動則正常讀取,不可互動則明確提示,不再拋enotsup崩潰;mix precommit全綠(含既有 196 測試與新增測試)。收到,開始處理:改善 stdin 互動偵測,不再只依賴
:io.rows(),讓非 TTY 環境(CI/管道)下vault互動指令有可預期行為(明確提示或走注入介面),並補測試、跑mix precommit全綠。已完成修正,PR #20(分支
fix/vault-non-tty-stdin,commit a29b976)待審核。根因:
:io.rows/0/:io.columns/0走 io 協定詢問 group leader,escript(erl -noshell的standard_io)不支援行列查詢、一律回enotsup——真終端機被誤判成非 TTY,vault unlock等互動指令直接報「請在終端機執行」。修正:新增
BearCli.TTY,改 readlink/proc/self/fd/0判定 fd 0 實際裝置(/dev/pts/*、/dev/tty*、/dev/console、/dev/ptmx= TTY;pipe/檔案/socket 非 TTY);無/proc平台退回:io.rows/0。vault/self_service/accounts三處偵測點統一改用。非 TTY 行為不變(明確提示+退出碼 2,不崩潰)。驗收對應:
</dev/null皆明確提示 exit 2。mix precommit全綠(200 passed=原 196+新增 TTY 測試 4)。issue 依流程保留待審核後關閉。
PR #20 已驗證符合本 issue 要求並合併(merge commit 41c30155),關閉本 issue。
審核驗證(獨立重跑):