SO에 대한 동일한 기사의 예제 중 일부를 사용할 수있었습니다 .Bash 에서 커서 위치를 얻는 방법은 무엇입니까? . 나는 이것이 작동하고 솔루션의 내용이 실제로 U & L에 있음을 보여주기 위해 여기에 게시하고 있습니다.
배쉬 솔루션
스크립트 내부에서
#!/bin/bash
# based on a script from http://invisible-island.net/xterm/xterm.faq.html
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
# on my system, the following line can be replaced by the line below it
echo -en "\033[6n" > /dev/tty
# tput u7 > /dev/tty # when TERM=xterm (and relatives)
IFS=';' read -r -d R -a pos
stty $oldstty
# change from one-based to zero based so they work with: tput cup $row $col
row=$((${pos[0]:2} - 1)) # strip off the esc-[
col=$((${pos[1]} - 1))
echo "(row,col): $row,$col"
참고 : 출력을 약간 변경했습니다!
예
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
대화식 쉘
이 명령 체인은 커서의 행과 열 위치를 얻는 데 효과적이었습니다.
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
예
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
13;1
$ clear
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
2;1
참고 : 이 방법은 모든 유형의 스크립트에서 사용할 수없는 것으로 보입니다. 대화 형 터미널의 간단한 명령조차도 작동하지 않았습니다. 예를 들면 다음과 같습니다.
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
무기한 걸려요
대시 / sh 솔루션
스크립트 내부에서
이 솔루션은 dash
POSIX와 호환되는 Ubuntu / Debian 시스템과 함께 제공 됩니다. 이 때문에 read
명령은-d
다른 차이점 중에서 스위치를 .
이 문제를 해결하려면 스위치 sleep 1
대신 을 사용하는 솔루션이 -d
있습니다. 이것은 이상적이지는 않지만 최소한 작동하는 솔루션을 제공합니다.
#!/bin/sh
exec < /dev/tty
oldstty=$(stty -g)
stty raw -echo min 0
tput u7 > /dev/tty
sleep 1
IFS=';' read -r row col
stty $oldstty
row=$(expr $(expr substr $row 3 99) - 1) # Strip leading escape off
col=$(expr ${col%R} - 1) # Strip trailing 'R' off
echo "(row,col): $col,$row"
예
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
대화식 쉘
sh
대화 형 셸 에서만 작동하는 실행 가능한 솔루션을 찾을 수 없습니다 .