smam
및 등의 터미널 설정 상태를 어떻게 검색할 수 있나요 rmam
?
그 이유는 rmam
내가 설정한 것입니다.
tput rmam
스크립트에서 smam
이탈 설정을 진행합니다.
tput smam
그러나 스크립트가 시작될 때 터미널이 이미 설정되어 있으면 종료 시 설정 rmam
하고 싶지 않습니다 .smam
이것이 어떻게 달성될 수 있습니까?
답변1
이를 지원하는 터미널 에뮬레이터에서는 이스케이프("DEC 개인 모드 요청")를 사용하여 \033[?7$p
이 매개변수( => 단어 줄 바꿈 모드)를 쿼리 할 수 있습니다.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
그러나 많은 터미널 에뮬레이터( 특히 screen
및tmux
지원하지 않음탈출한 사람들. 적어도 기본적으로는 아닙니다. 따라서 이것은 모두 순수한 퀴즈입니다. 실제로는 아무것도 할 수 없습니다 ;-)
답변2
매우 보기 흉하지만 탐지 가능함:
#!/bin/bash
# Detect smam / rmam by printing COLUMNS characters and
# checking cursor line before and after.
smam()
(
local -i smam r1 r2 cw
exec </dev/tty
local t=$(stty -g)
trap 'stty "$t"; return' EXIT QUIT INT TERM
stty -icanon -echo time 1 min 0
# Terminal width + 1
(( cw = $(tput cols) + 1 ))
# Create a blank line and go back up (in case we are at bottom)
printf "\n"
tput cuu1
# Get cursor row 1
printf "\x1b[6n" >/dev/tty
r1=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')
# Print columns + 1 spaces
for ((i = 0; i < cw; ++i)); do printf " "; done
# Get cursor row 2 AND go to start of line
printf "\x1b[6n\r" >/dev/tty
r2=$(dd count=1 2>/dev/null | sed 's/\x1b\[\(.*\);.*/\1/')
# smam is true if we are at a higher line number
(( smam = r2 - r1 ))
# Clear line
tput el
# If smam clear line we started on as well
(( smam )) && tput cuu1 && tput el
# Optional debug check
# printf "%d %d\n" $x1 $x2
return $(( smam ^ 1 ))
)
# example:
smam && echo smam || echo rmam
한 가지 특이한 점은 사람들이 새로운 회선에 전화를 걸려면 대기 상태에 있어야 한다는 것입니다.