2010-04-04 16 views
20

एक बैश स्क्रिप्ट में, मैं एक चर में कर्सर कॉलम प्राप्त करना चाहता हूं। यह एएनएसआई भागने कोड {ESC}[6n निम्नलिखित तरीके का उपयोग कर इसे पाने के लिए एक ही रास्ता है, उदाहरण के लिए दिखाई देता है:बैश में कर्सर की स्थिति कैसे प्राप्त करें?

# Query the cursor position 
echo -en '\033[6n' 

# Read it to a variable 
read -d R CURCOL 

# Extract the column from the variable 
CURCOL="${CURCOL##*;}" 

# We have the column in the variable 
echo $CURCOL 

दुर्भाग्य से, इस मानक आउटपुट में पात्रों प्रिंट और मैं इसे चुपचाप करना चाहते हैं। इसके अलावा, यह बहुत पोर्टेबल नहीं है ...

क्या यह हासिल करने के लिए एक शुद्ध-बैश तरीका है?

उत्तर

29

आप गंदा चाल का सहारा लेना है:

#!/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)) 
+0

वाह, मैंने टर्मिनल स्विच करने के बारे में नहीं सोचा था, धन्यवाद! – nicoulaj

+0

हम 'सी' भाषा में इस 'बैश' कोड का उपयोग कैसे कर सकते हैं? – Rasoul

+1

@ रसूल: आपको इसे एक अलग प्रश्न के रूप में पूछना चाहिए। –

8

मैं जानता हूँ कि यह पता द्वारा हल किया जा सकता है, लेकिन तुम सिर्फ साथ "-s" चुपचाप काम करने के लिए पढ़ने के लिए बता सकते हैं:

echo -en "\E[6n" 
read -sdR CURPOS 
CURPOS=${CURPOS#*[} 

और फिर CURPOS "21; 3" जैसे कुछ के बराबर है।

+1

मेरे लिए यह इंटरैक्टिव खोल में काम करता है लेकिन एक स्क्रिप्ट के अंदर नहीं – etuardu

+0

इसके लिए धन्यवाद, मुझे मेकफ़ाइल में बाकी पंक्ति भरनी पड़ी और एक समारोह के अंदर इसके साथ समाप्त हो गया: 'echo "\ 033 [6n \ c" ; रीड-एसडीआर सर्पस; COLS_LEFT = "$$ (expr $$ TERM_COLS - $$ (echo $$ {CURPOS} | cut -d ';' -f 2;) + 1)"; ' – mVChr

+0

' echo -en "\ 033 [6n"; नींद 1; read -sdR' यह विधि गलत है। आपको echo कमांड से पहले lflag ECHO को अक्षम करना होगा। – zhangyoufu

2

पोर्टेबिलिटी के हितों में मुझे लगता है कि पानी का छींटा तरह के गोले में चलेंगे एक वेनिला POSIX संगत संस्करण बनाने में एक जाना था:

#!/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 $col,$row 

... लेकिन मैं एक खोजने के लिए नहीं कर पा रहे बैश के 'के लिए व्यवहार्य विकल्प read -d'। नींद के बिना, स्क्रिप्ट पूरी तरह से रिटर्न आउटपुट को याद करती है ...

-6

ट्यूट कमांड जो आपको उपयोग करने की आवश्यकता है। सरल, तेज़, स्क्रीन पर कोई आउटपुट नहीं।

#!/bin/bash 
col=`tput col`; 
line=`tput line`; 
+10

आप किस ओएस और संस्करण का उपयोग कर रहे हैं जो यह आपके लिए काम करता है? मेरे सिस्टम पर, "col" और "line" नामक कोई टर्मिंफो क्षमता नहीं है। हालांकि, बहुवचन, "कोल्स" और "रेखाएं" मौजूद हैं, लेकिन वे मौजूदा कर्सर स्थिति की बजाय कॉलम और रेखाओं की कुल संख्या वापस कर देते हैं। –

संबंधित मुद्दे