Tôi đã có thể sử dụng một số ví dụ từ cùng một bài viết về SO, có tiêu đề: Làm thế nào để có được vị trí con trỏ trong bash? . Tôi đang đăng bài này lên đây chỉ để cho thấy rằng chúng hoạt động và nội dung của các giải pháp cũng thực sự có trên U & L.
Giải pháp Bash
Từ trong một kịch bản
#!/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"
LƯU Ý: Tôi đã thay đổi đầu ra một chút!
Thí dụ
$ ./rowcol.bash
(row,col): 43,0
$ clear
$ ./rowcol.bash
(row,col): 1,0
Vỏ tương tác
Chuỗi lệnh này hoạt động để lấy vị trí hàng và cột của con trỏ:
$ echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}"
Thí dụ
$ 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
LƯU Ý: Phương pháp này dường như không thể sử dụng được từ bất kỳ loại tập lệnh nào. Ngay cả các lệnh đơn giản trong một thiết bị đầu cuối tương tác cũng không hoạt động với tôi. Ví dụ:
$ pos=$(echo -en "\E[6n";read -sdR CURPOS; CURPOS=${CURPOS#*[};echo "${CURPOS}")
chỉ treo vô thời hạn.
giải pháp dash / sh
Từ trong một kịch bản
Giải pháp này dành cho các hệ thống Ubuntu / Debian đi kèm dash
, tương thích POSIX. Do đó, read
lệnh không hỗ trợ -d
chuyển đổi giữa các khác biệt khác.
Để giải quyết vấn đề này, có giải pháp này sử dụng sleep 1
thay thế -d
công tắc. Điều này không lý tưởng nhưng cung cấp ít nhất một giải pháp làm việc.
#!/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"
Thí dụ
$ ./rowcol.sh
(row,col): 0,24
$ clear
$ ./rowcol.sh
(row,col): 0,1
Vỏ tương tác
Tôi không thể tìm thấy một giải pháp khả thi chỉ hoạt động sh
trong một vỏ tương tác.