Scripting

獲取 termcap 功能的終端狀態

  • January 28, 2021

如何檢索終端設置的狀態,如smamrmam

原因是我設置rmam的:

tput rmam

smam在腳本中,然後在退出時繼續設置:

tput smam

但是如果終端rmam在腳本啟動時設置了,我不想smam在退出時設置。


如何才能做到這一點?

在支持它的終端仿真器上,您可以使用\033[?7$p轉義符(“請求 DEC 私有模式”)來查詢該參數(7=> 自動換行模式):

decrqm()(
   exec </dev/tty
   t=$(stty -g)
   trap 'stty "$t"; return' EXIT QUIT INT TERM
   stty -icanon -echo time 1 min 0
   e=$(printf '\033')
   printf "${e}[$1\$p" >/dev/tty
   case $(dd count=1 2>/dev/null) in
   "${e}[$1;1\$y") echo on;;
   "${e}[$1;2\$y") echo off;;
   *) echo unknown;;
   esac
)

$ tput smam  # printf '\033[?7h'
$ decrqm '?7'
on
$ tput rmam  # printf '\033[?7l'
$ decrqm '?7'
off

更好的方法是在啟動腳本時保存該設置,\033[?7s並在退出時恢復\033[?7r它:

save_am(){ printf '\033[?7s'; }
restore_am(){ printf '\033[?7r'; }

save_am
tput rmam
..
restore_am

但是許多終端仿真器(尤其是screenand tmux不支持這些轉義。至少預設情況下不是。所以這一切都是純粹的瑣事——你不能將它用於任何實際的事情;-)

引用自:https://unix.stackexchange.com/questions/631075