मैं एसओ पर एक ही लेख से कुछ उदाहरणों का उपयोग करने में सक्षम था, जिसका शीर्षक था: बैश में कर्सर की स्थिति कैसे प्राप्त करें? । मैं इसे यहाँ पोस्ट कर रहा हूँ बस यह दिखाने के लिए कि वे काम करते हैं और समाधान की सामग्री वास्तव में 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}")
बस अनिश्चित काल के लिए लटका हुआ है।
पानी का छींटा / श समाधान
एक स्क्रिप्ट के अंदर से
यह समाधान उबंटू / डेबियन सिस्टम के लिए है जो स्टॉक के साथ आते हैं dash
, जो कि पॉसिक्स कंप्लेंट है। इस वजह से, 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
एक इंटरैक्टिव शेल में काम करता है।