2011-04-22 11 views
5

मैं उपयोगकर्ता इनपुट को संभालना चाहता हूं, लेकिन पृष्ठभूमि में, एक नए धागे की तरह।पृष्ठभूमि पर उपयोगकर्ता इनपुट को संभालें

उदाहरण के लिए, एक प्रगति बार दिखाने के लिए, और जब उपयोगकर्ता आर, प्रगति बार फिर सेट करता है मारता है, या उपयोगकर्ता क्यू दबाता है, स्क्रिप्ट बाहर निकालता है।

मैं नहीं चाहता कि स्क्रिप्ट उपयोगकर्ता इनपुट के लिए प्रतीक्षा करे। बस सबकुछ प्रस्तुत करें और यदि उपयोगकर्ता किसी भी कुंजी को हिट करता है तो कुछ करें।

क्या यह बैश में सकारात्मक है?

अग्रिम धन्यवाद।

संपादित करें: मैं स्क्रिप्ट हमेशा पढ़ने के लिए उपयोगकर्ता इनपुट की जरूरत है, लेकिन मुख्य loop.Complicated के निष्पादन मैं अपने आप को अंग्रेजी

_handle_keys() 
{ 
    read -sn1 a 
    test "$a" == `echo -en "\e"` || continue 
    read -sn1 a 
    test "$a" == "[" || break 
    read -sn1 a 

    case "$a" in 
     C) # Derecha 
      if [ $PALETTE_X -lt $(($COLUMNS-$PALETTE_SIZE)) ] ; then 
       PALETTE_X=$(($PALETTE_X+1)) 
      fi 
     ;; 
     D) # Izquierda 
      if [ $PALETTE_X -gt 0 ] ; then 
       PALETTE_X=$(($PALETTE_X-1)) 
      fi 
     ;; 
    esac 
} 
render() 
{ 
    clear 
    printf "\033[2;0f BALL (X:${BALL_X} | Y:${BALL_Y})" 
    _palette_render # Actualiza la paleta 
    _ball_render 
} 

while true 
do 
    LINES=`tput lines` 
    COLUMNS=`tput cols` 

    render 
    _handle_keys 
done 

में समझा मेरी स्क्रिप्ट में, गेंद चाल बाधित ना करें (render>_ball_render) केवल तभी जब कोई कुंजी दबाई जाती है क्योंकि _handle_keys उपयोगकर्ता इनपुट की प्रतीक्षा करें।

मैं read -t0.1 के साथ एक बदसूरत समाधान किया जाता है, लेकिन इस

पीडी पसंद नहीं है: मेरा आखिरी टिप्पणी के लिए क्षमा करें, मेरी संपादन

+0

@ user719946 आपको यह स्पष्ट करने की आवश्यकता हो सकती है कि आप क्या करने का प्रयास कर रहे हैं। अगर वे टर्मिनल से पढ़ने की कोशिश करते हैं तो पृष्ठभूमि नौकरियां निलंबित हो जाएंगी। मुझे "बैश गैर-अवरुद्ध आईओ" के लिए कुछ परिणाम मिल रहे हैं, क्या आप ऐसा करने की कोशिश कर रहे हैं? इसके अलावा, विषय में [bash] डालने की कोई आवश्यकता नहीं है, टैग पर्याप्त है। आपके जवाब के लिए – Andy

+0

@andy thx। मैं एक पोंग गेम की तरह कुछ लिपि कर रहा हूँ। गेंद अद्यतन आंदोलन एक मुख्य पाश में है (जबकि सच करते हैं)। तो, पढ़ा गया इनपुट (पैलेट को ले जाएं) गेंद की गति को अवरुद्ध करें क्योंकि उपयोगकर्ता तब तक प्रतीक्षा करें जब तक उपयोगकर्ता किसी भी कुंजी को दबाए। आशा है आप मुझे समझते हो। [Bash] के लिए खेद है और कोई उपयोगकर्ता नाम नहीं; यह मेरा पहला सवाल है। – jotapdiez

उत्तर

7

यहाँ के बीच में समय संपादित खत्म एक तकनीक है कि लगता है काम। मैं इसे सैम होसेवर के जवाब पर Bash: How to end infinite loop with any key pressed? पर आधारित कर रहा हूं।

#!/bin/bash 

if [ ! -t 0 ]; then 
    echo "This script must be run from a terminal" 
    exit 1 
fi 

stty -echo -icanon time 0 min 0 

count=0 
keypress='' 
while true; do 
    let count+=1 
    echo -ne $count'\r' 

    # This stuff goes in _handle_keys 
    read keypress 
    case $keypress in 
    # This case is for no keypress 
    "") 
    ;; 
    $'\e[C') 
    echo "derecha" 
    ;; 
    $'\e[D') 
    echo "izquierda" 
    ;; 
    # If you want to do something for unknown keys, otherwise leave this out 
    *) 
    echo "unknown input $keypress" 
    ;; 
    esac 
    # End _handle_keys 
done 

stty sane 

stty sane याद किया जाता है (उदाहरण के लिए, क्योंकि स्क्रिप्ट Ctrl साथ मार डाला जाता है - सी) हैं, टर्मिनल एक अजीब स्थिति में छोड़ दिया जाएगा। आप इसे संबोधित करने के लिए trap कथन देख सकते हैं।

+0

आपकी स्क्रिप्ट में, एक कुंजी दबाए जाने पर लूप समाप्त होता है। मैं आपको अपनी स्क्रिप्ट दिखाने के लिए अपनी पहली पोस्ट अपडेट कर रहा हूं। – jotapdiez

+0

@jotapdiez मैंने उदाहरण अपडेट किया। मुझे यकीन नहीं है कि यह धीमी टर्मिनल पर कितना अच्छा काम करेगा, बहु-बाइट अनुक्रम टूट जाएंगे। लेकिन यह करीब होना चाहिए। – Andy

+0

काम करता है !! मैंने कुछ अन्य चीजों को बेहतर काम करने के लिए बनाया है लेकिन आपका उत्तर ठीक काम करता है। धन्यवाद। (मैं वोट नहीं दे सकता क्योंकि अधिक प्रतिनिधि की जरूरत है, क्षमा करें) – jotapdiez

1

टर्मिनल को मूल स्थिति में रीसेट करने के लिए आप स्क्रिप्ट के अंत में "रीसेट" भी जोड़ सकते हैं, या यह लॉक लग सकता है। यह स्क्रीन को भी साफ़ कर देगा, इसलिए कोई भी आदेश निष्पादित करने से पहले एक विराम जोड़ना चाहता है।

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