stty(Set TTY)用於變更與列印終端機連線參數,控制輸入輸出處理模式、特殊字元對應、流量控制等。掌握 stty 能解決終端機顯示異常、自動化腳本互動、安全輸入密碼等問題。
| 參數 | 功能 |
|---|---|
-a | 顯示所有目前設定 |
-g | 以十六進位輸出目前設定(可供還原) |
icanon / -icanon | 標準/非標準輸入模式(是否需 Enter 送出) |
echo / -echo | 開啟/關閉回顯 |
iuclc / -iuclc | 輸入大寫轉小寫 / 還原 |
olcuc / -olcuc | 輸出小寫轉大寫 / 還原 |
size | 顯示終端機行數、列數 |
eof <字串> | 重新定義 EOF 字元(預設 Ctrl+D) |
igncr / -igncr | 忽略/不忽略 CR (\\r) |
raw / -raw | 原始模式(關閉所有處理) |
stty iuclc # 開啟:輸入大寫自動轉小寫
stty -iuclc # 還原
stty olcuc # 開啟
stty -olcuc # 還原
stty size
# 輸出:24 80 (rows cols)
stty eof "^^" # 設為 Ctrl+^
stty eof "^d" # 還原 Ctrl+D
stty -echo # 關閉回顯
stty echo # 開啟回顯
# 測試:輸入不顯示,按 Enter 後恢復顯示
stty -echo; read; stty echo; read
stty igncr # 忽略 \\r
stty -igncr # 還原
# 方法一:stty 暫時修改
timeout_read() {
local timeout=$1
local old=$(stty -g)
stty -icanon min 0 time 100 # 10 秒 = 100 * 0.1s
eval read varname
stty "$old"
}
# 方法二:bash 內建 read -t(推薦,更簡單)
read -t 10 varname
old=$(stty -g) 保存;結束時用 stty "$old" 還原,避免影響後續操作。trap 'stty "$old"' EXIT 確保異常退出也能還原。-icanon) 下 read 行為不同,需注意 min/time 參數意義。| 現象 | 可能原因 | 解決 |
|---|---|---|
| 輸入不顯示 | stty -echo 未還原 | 執行 stty echo 或重新開啟終端機 |
| 按 Enter 無反應 | stty -icanon 模式 | 執行 stty icanon |
| 大小寫顛倒 | iuclc/olcuc 誤開啟 | 執行 stty -iuclc -olcuc |
stty 是終端機行為的「總開關」,熟練運用能處理特殊互動需求、安全輸入、腳本自動化測試等場景。建議將常用組合封裝為函數庫,提升開發效率。