जारी रखने के लिए स्पेस को दबाएं


73

उपयोगकर्ता द्वारा दबाए जाने तक मैं एक बैश स्क्रिप्ट कैसे रोक सकता हूं Space?

मैं अपनी स्क्रिप्ट में सवाल करना चाहूंगा

जारी रखने या बाहर निकलने के लिए CTRL+ दबाएँC

और फिर स्क्रिप्ट को रुकना चाहिए और तब तक इंतजार करना चाहिए जब तक स्पेस दबाया न जाए।


यह सब और अधिक तो इस एसओ क्यू एंड ए बीटीडब्ल्यू में संबोधित किया गया है: डॉस पॉज के बराबर लिनक्स क्या है?
स्लम


जवाबों:


58

आप उपयोग कर सकते हैं read:

read -n1 -r -p "Press space to continue..." key

if [ "$key" = '' ]; then
    # Space pressed, do something
    # echo [$key] is empty when SPACE is pressed # uncomment to trace
else
    # Anything else pressed, do whatever else.
    # echo [$key] not empty
fi

12
आपको ऐड-एस को टर्मिनल पर दबाए गए चरित्र को प्रिंट नहीं करने के लिए जोड़ना चाहिए। और अंत में एक लाइनब्रेक जोड़ें, या आउटपुट प्रश्न की तरह सीधे उसी पंक्ति में जारी रहेगा। सबसे अच्छा होगा:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
Rubo77

1
यह स्क्रिप्ट काम नहीं करती है। बस इसे Red Hat linux पर परीक्षण किया गया ... elseब्लॉक हमेशा चलता है, यहां तक ​​कि जब स्पेसबार दबाया जाता है।
रॉबट

3
@robert यह है क्योंकि आप का उपयोग नहीं करते bash। यह काम करता है यदि आप read _इसके बजाय उपयोग करते हैं, यदि आपके पास कुछ अन्य शेल है bash
निकलस रोसेंक्रांत्ज़

क्या ''अंदर जगह होनी चाहिए ?
जोस एंटोनियो ड्यूरा ओलमोस

यह ''एक खाली स्ट्रिंग के लिए है। अंदर कोई जगह नहीं। मुझे लगता है, यह भी फिट बैठता है, अगर आप
rubo77

44

इस SO Q & A में जिस पद्धति पर चर्चा की गई है, वह संभवतः उस pauseव्यवहार के विकल्प के लिए सबसे अच्छा उम्मीदवार है जो BAT फाइलें करते समय आप विंडोज पर आदी हैं।

$ read -rsp $'Press any key to continue...\n' -n1 key

उदाहरण

यहां मैं ऊपर चल रहा हूं और फिर किसी भी कुंजी को दबा रहा हूं, इस मामले में Dकुंजी।

$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$ 

संदर्भ


मेरा मतलब है कि $यहाँ स्ट्रिंग से पहले क्यों -rsp $'Press:?
rubo77

2
@ रूबो77 - आह। यह है कि आप विशेष वर्णों के साथ शाब्दिक स्ट्रिंग कैसे कर सकते हैं। $ '...': यह फार्म की है
SLM

1
@ rubo77 - यह अलग है। यह एक डॉलर चिह्न w / डबल उद्धरण है, मैंने एक डॉलर w / एकल उद्धरण का उपयोग किया है। कृपया वह टिप्पणी हटा दें, यह गलत है।
स्लम

1
आह! मुझे समझ आ गया। यदि आप प्रॉम्प्ट-स्ट्रिंग के अंदर बच गए अनुक्रम डालते हैं। देखें wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77

@ rubo77 - हाँ कि अंकन से बचने के लिए अनुमति मिलती है w / o किसी भी अतिरिक्त echo -e "..."लाइनों को शामिल किया जाए। यह उन परिस्थितियों में बहुत अधिक कॉम्पैक्ट है।
स्लम

6
hold=' '
printf "Press 'SPACE' to continue or 'CTRL+C' to exit : "
tty_state=$(stty -g)
stty -icanon
until [ -z "${hold#$in}" ] ; do
    in=$(dd bs=1 count=1 </dev/tty 2>/dev/null)
done
stty "$tty_state"

यह अब एक अनुगामी न्यूलाइन के बिना एक संकेत प्रिंट करता CTRL+Cहै, मज़बूती से संभालता है, sttyकेवल आवश्यकतानुसार जितनी बार आह्वान करता है, और इसे नियंत्रित करने के लिए नियंत्रित ट्टी को पुनर्स्थापित करता है, जिसमें sttyयह पाया गया था। में देखो man sttyकैसे स्पष्ट रूप से गूँज, नियंत्रण वर्ण और सभी को नियंत्रित करने के बारे में जानकारी के लिए।

आप भी ऐसा कर सकते हैं:

printf "Press any key to continue or 'CTRL+C' to exit : "
(tty_state=$(stty -g)
stty -icanon
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
stty "$tty_state"
) </dev/tty

आप इसके साथ कर सकते हैं ENTER, कोई [परीक्षण ]नहीं और कोई sttyपसंद नहीं :

sed -n q </dev/tty

5

आप इसके लिए एक समारोह बना सकते हैं:

pause(){
 read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}

फिर आप अपनी स्क्रिप्ट में हर जगह इसका उपयोग कर सकते हैं:

pause

यदि आप शेल स्क्रिप्टिंग के लिए नए हैं - तो आपको इसे उपयोग करने से पहले फ़ंक्शन को अपनी स्क्रिप्ट के शीर्ष पर रखना होगा
रिचर्ड

3

आलसी एक लाइनर:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

नुकसान यह है कि जब उपयोगकर्ता ctrl + c दबाता है तो आप नियंत्रण खो देते हैं। स्क्रिप्ट हमेशा उस मामले में कोड 130 के साथ बाहर निकल जाएगी।


2

IFSखाली स्ट्रिंग की सेटिंग्स सफेद स्थान को ट्रिम करने के डिफ़ॉल्ट व्यवहार को पढ़ती हैं।

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    # Set IFS to empty string so that read doesn't trim
    # See http://mywiki.wooledge.org/BashFAQ/001#Trimming
    IFS= read -n1 -r key
    [[ $key == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this

अद्यतन 2018-05-23: हम REPLY चर का उपयोग करके इसे सरल कर सकते हैं, जो शब्द-विभाजन के अधीन नहीं है:

try_this() {
  echo -n "Press SPACE to continue or Ctrl+C to exit ... "
  while true; do
    read -n1 -r
    [[ $REPLY == ' ' ]] && break
  done
  echo
  echo "Continuing ..."
}
try_this

1

यहाँ एक तरीका है कि दोनों में काम करता है bashऔर zsh, और मैं टर्मिनल के लिए सुनिश्चित करता है / हे:

# Prompt for a keypress to continue. Customise prompt with $*
function pause {
  >/dev/tty printf '%s' "${*:-Press any key to continue... }"
  [[ $ZSH_VERSION ]] && read -krs  # Use -u0 to read from STDIN
  [[ $BASH_VERSION ]] && </dev/tty read -rsn1
  printf '\n'
}
export_function pause

इसे अपने .{ba,z}shrcमहान न्याय के लिए रखो !

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.