ฉันสามารถใช้ตัวอย่างจากบทความเดียวกันใน SO ชื่อเรื่อง: วิธีการรับตำแหน่งเคอร์เซอร์ในทุบตี? . ฉันโพสต์ที่นี่เพียงเพื่อแสดงให้เห็นว่าพวกเขาทำงานและเนื้อหาของการแก้ปัญหาเป็นจริงใน U&L เช่นกัน
Bash solutions
จากภายในสคริปต์
#!/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
จากภายในสคริปต์
โซลูชันนี้สำหรับระบบ Ubuntu / Debian ที่มีสต็อคdash
ซึ่งเป็นไปตาม POSIX ด้วยเหตุนี้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
เชลล์เชิงโต้ตอบเท่านั้น