xterm を使用している場合は、使用しているモードを尋ねることができます。代替画面機能は「DEC」ではなく xterm の機能ですが、設定はXTerm Control SequencesDECSET
で説明されているモードとグループ化されています。
CSI ? Pm h
DEC Private Mode Set (DECSET).
...
Ps = 1 0 4 7 -> Use Alternate Screen Buffer, xterm. This
may be disabled by the titeInhibit resource.
Ps = 1 0 4 8 -> Save cursor as in DECSC, xterm. This may
be disabled by the titeInhibit resource.
Ps = 1 0 4 9 -> Save cursor as in DECSC, xterm. After sav-
ing the cursor, switch to the Alternate Screen Buffer, clear-
ing it first. This may be disabled by the titeInhibit
DECRQM
コントロールを使用して、端末にクエリを実行できます。
CSI ? Ps$ p
Request DEC private mode (DECRQM). For VT300 and up, reply
DECRPM is
CSI ? Ps; Pm$ y
where Ps is the mode number as in DECSET/DECSET, Pm is the
mode value as in the ANSI DECRQM.
つまり、スクリプトは
printf '\033[?1049$p'
次のようなものを期待して、結果を読み返します\033[?1049;1$y
簡単なデモを次に示します。
#!/bin/sh
unexpected() {
result=$(echo "$check"|sed -e 's/^@/\\033/')
printf '? unexpected reply: %s\n' "$result"
exit 1
}
exec </dev/tty
old=`stty -g`
stty raw -echo min 0 time 5
printf '\033[?1049$p'
read status
stty $old
if [ -n "$status" ]
then
check=$(echo "$status" |tr '\033' '@')
if [ "$check" != "$status" ]
then
case "$check" in
'@[?1049;1$y')
echo "alternate screen"
;;
'@[?1049;2$y')
echo "normal screen"
;;
*)
unexpected
;;
esac
else
unexpected
fi
else
echo "? no reply from terminal"
fi
もちろん、xterm を使用していない場合、マイレージは異なる場合があります...