Linux DOS पॉज़ के समतुल्य है?


236

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

जवाबों:


329

read क्या ये:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1निर्दिष्ट करता है यह केवल एक ही चरित्र के लिए इंतजार कर रहा है कि। -rकहते हैं यह कच्चे मोड है, जो क्योंकि अन्यथा आवश्यक है, यदि आप बैकस्लैश की तरह कुछ प्रेस में, यह दर्ज नहीं करता, जब तक आप अगले कुंजी को दबाएँ। -pनिर्दिष्ट शीघ्र, जो अगर यह रिक्ति उद्धृत किया जाना चाहिए। keyयदि आप जो कुंजी वे दबाया, जिस स्थिति में आप इसे माध्यम से पहुँच सकते जानना चाहता हूँ तर्क केवल आवश्यक है $key

यदि आप बैश का उपयोग कर रहे हैं, तो आप इसके साथ एक टाइमआउट भी निर्दिष्ट कर सकते हैं -t, जो कुंजी को दबाए नहीं रहने पर विफलता को वापस करने का कारण बनता है। उदाहरण के लिए:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi

5
कड़ाई से बोल, कि होगा "Enter any non-NUL character to continue"। कुछ कुंजियाँ किसी वर्ण को नहीं भेजती हैं (जैसे Ctrl...) और कुछ एक से अधिक भेजती हैं (जैसे F1, Home...)। bashएनयूएल वर्णों की उपेक्षा करता है।
स्टीफन चेजेलस

2
आमतौर पर यह एक विशिष्ट कुंजी के लिए पूछने के लिए एक बेहतर विचार है जैसे कि प्रवेश, स्थान या वाई। "कोई भी" कुछ उपयोगकर्ताओं को भ्रमित कर सकता है, एक TAB- कुंजी है इसलिए कोई भी कुंजी नहीं है और निश्चित रूप से ऐसी चाबियाँ हैं जो संभावित रूप से खतरनाक हैं जैसे ESCAPE, CTRL, CMD, पॉवर बटन, आदि आज के समय में इतना प्रासंगिक नहीं है, क्योंकि आजकल कंसोल आमतौर पर केवल उन्नत कंप्यूटर उपयोगकर्ताओं द्वारा उपयोग किया जाता है जो "किसी भी कुंजी" की सही व्याख्या करेगा। Apple 2 डिज़ाइन मैनुअल, जो काफी पुराना है, इस विषय के लिए समर्पित एक दिलचस्प खंड है ( apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf )।
गेलवेइलर

3
यदि आप इसके बजाय संदेश का उपयोग करते हैं, Press a key to continue...तो भी नौसिखिए उपयोगकर्ता aकुंजी को खोजने और इसे दबाने में सक्षम होंगे , ओ)
डीजेडेवार्क

1
इसके साथ command | myscript.shया मुद्दे होंगे myscript.sh | command। समाधान के लिए यह उत्तर देखें ।
टॉम हेल

अगर किसी को read: 1: read: Illegal option -nआपकी कमांड bash -c 'command && command'आदि को लपेटना सुनिश्चित हो जाता है, तो उस त्रुटि की संभावना है sh। मैं यह एक लैंडो रैपर कमांड में कर रहा हूं।
एलिय्याह लिन

155

मैं इन तरीकों का उपयोग करता हूं जो बहुत कम हैं, और वे @theunamedguy और @Jim समाधानों की तरह हैं, लेकिन इसके अलावा टाइमआउट और साइलेंट मोड के साथ।

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

आदेश

  • समाधान दर्ज करें

    read -rsp $'Press enter to continue...\n'
  • पलायन समाधान (-d $ '\ e' के साथ)

    read -rsp $'Press escape to continue...\n' -d $'\e'
  • कोई भी महत्वपूर्ण समाधान (एन -1 के साथ)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
  • प्रश्न के विकल्प के साथ चयन किया गया (-E $ 'Y' के साथ)

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
  • टाइमआउट समाधान (-t 5 के साथ)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
  • नींद बढ़ी उर्फ

    read -rst 0.5; timeout=$?
    # echo $timeout

व्याख्या

-r कच्चा मोड निर्दिष्ट करता है, जो "\" या "^" जैसे संयुक्त वर्णों की अनुमति नहीं देता है।

-s मूक मोड निर्दिष्ट करता है, और क्योंकि हमें कीबोर्ड आउटपुट की आवश्यकता नहीं है।

-p $ ' प्रॉम्प्ट ' प्रॉम्प्ट को निर्दिष्ट करता है, जिसे रिक्त स्थान और बच गए वर्णों को जाने के लिए $ 'और' के बीच होना चाहिए। सावधान रहें, आपको बच गए पात्रों को लाभ पहुंचाने के लिए डॉलर के प्रतीक के साथ एकल उद्धरणों के बीच रखना होगा, अन्यथा आप सरल उद्धरणों का उपयोग कर सकते हैं।

-d $ ' \ e ' सीमांकक के रूप में सीमांकक निर्दिष्ट करता है, इसलिए वर्तमान प्रविष्टि के लिए एक अंतिम चरित्र के रूप में, यह किसी भी चरित्र को डालना संभव है लेकिन एक चरित्र डालने के लिए सावधान रहें जो उपयोगकर्ता टाइप कर सकता है।

-n 1 निर्दिष्ट करता है कि इसे केवल एकल वर्ण की आवश्यकता है।

-e निर्दिष्ट मोड ReadLine।

-i $ ' Y ' वाई को रीडलाइन मोड में प्रारंभिक पाठ के रूप में निर्दिष्ट करता है।

-टी 5 में 5 सेकंड का टाइमआउट निर्दिष्ट किया गया है

मामले में महत्वपूर्ण सेवा आपको इनपुट, इन-एन 1 मामले को जानने की जरूरत है, जिसे कुंजी दबाया गया है।

$? पिछले प्रोग्राम के एग्जिट कोड को जानने के लिए पढ़ें, टाइमआउट के मामले में 142, 0 सही इनपुट। $ रखो? जितनी जल्दी हो सके एक चर में अगर आपको आदेशों के बाद इसका परीक्षण करने की आवश्यकता है, क्योंकि सभी आदेश $ फिर से लिखेंगे?


1
समझाने के लिए +1 -s; man readऔर read --helpUbuntu 10.04.1 LTS पर मदद नहीं की। संपादित करें: help readकिया; क्या बाकी को पदावनत कर दिया गया है?
सेस टिम्मरमैन

1
महान विवरण के लिए 1+: लेकिन मैं read: -i: invalid optionपूर्व के लिए मिला । इसके बजाय read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;#osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;मेरे लिए काम करता है। `
टीनो रूब

मुझे नहीं पता कि यह OSX पर कैसे काम करता है, लेकिन मैंने कुछ परीक्षण किए हैं और -iउबंटू पर पूरी तरह से काम करता है, मुझे यह भी पता नहीं है कि अगर -dOSX पर उसी तरह काम करता है।
y.petremann

पढ़ने से पहले एक प्रतिध्वनि का उपयोग करके व्यक्ति वास्तव में त्वरित और अच्छा काम कर सकता है, अंततः प्रतिध्वनि कर सकता है
THESorcerer

15

readबिना किसी पैरामीटर के केवल तभी जारी रहेगा जब आप एंटर दबाएंगे। pauseयदि आप कोई कुंजी दबाते हैं तो DOS कमांड जारी रहेगी। read –n1यदि आप यह व्यवहार चाहते हैं, तो उपयोग करें ।


15

यह मेरे लिए लिनक्स के कई स्वादों पर काम करता था, जहां इनमें से कुछ अन्य समाधान नहीं थे (यहां सबसे लोकप्रिय लोगों सहित)। मुझे लगता है कि यह अधिक पठनीय है ...

echo Press enter to continue; read dummy;

ध्यान दें कि एक चर को एक तर्क के रूप में आपूर्ति की जानी चाहिए read


यह उत्तर मेरी समस्या को हल करता है, अगर मैं इस लाइन को कॉपी और पेस्ट करता हूँ और किसी कारण से मैं और अधिक लाइनें जोड़ देता हूँ, तो संलग्न लाइनों को निष्पादित नहीं किया जाता है, जैसे DOS पॉज़ के साथ था
Sérgio

10

read -n1पोर्टेबल नहीं है। ऐसा करने का एक पोर्टेबल तरीका हो सकता है:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

उपयोग करने के अलावा read, प्रेस ENTERको जारी रखने के लिए आप कर सकते हैं:

sed -n q </dev/tty

2
status=noneपोर्टेबल भी नहीं है। इसके बजाय stdout और stderr को / dev / null में रीडायरेक्ट करें। read -r line < /dev/ttyलिए enought होगा प्रेस दर्ज करें ...
स्टीफन चेजेलस

@StephaneChezales धन्यवाद - मुझे नहीं पता था कि। अब इसे ठीक करो। धन्यवाद फिर से - निश्चित। आप सार्थक जानकारी की एक अच्छी तरह से कर रहे हैं, वैसे।
चाटुकार

1
settings=$(stty -g); stty raw; dd ...; stty "$settings"ट्टी सेटिंग्स को बचाने और पुनर्स्थापित करने के लिए भी ध्यान दें ।
स्टीफन चेज़लस

@StephaneChezales - im एक कंप्यूटर पर नहीं - क्या आपको लगता है कि trसंपादित चीज़ भी काम कर सकती है?
चाटुकार

1
नहीं, क्योंकि trइसके उत्पादन को इसके पाइप के रूप में बफ़र किया जाएगा, और गैर-यूएस कीबोर्ड में कुंजियाँ होती हैं जो वर्णों को \1-\177सीमा के बाहर भेजती हैं । ddयहाँ मुहावरेदार तरीका है।
स्टीफन चेजलस

2

यदि आपको केवल एक लूप या स्क्रिप्ट को रोकने की आवश्यकता है, और आप किसी भी कुंजी के बजाय एंटर दबाकर खुश हैं, तो readअपने आप ही काम करेंगे।

do_stuff
read
do_more_stuff

यह अंत-उपयोगकर्ता के अनुकूल नहीं है, लेकिन उन मामलों में पर्याप्त हो सकता है जहां आप अपने लिए एक त्वरित स्क्रिप्ट लिख रहे हैं, और आपको पृष्ठभूमि में मैन्युअल रूप से कुछ करने के लिए इसे रोकने की आवश्यकता है।


यह सच है, लेकिन डेटाबेस के लिए यह एक उदाहरण दिखाने के लिए सबसे सहायक है।
एसडीसोलर

धन्यवाद, मैंने आपकी सलाह को बोर्ड पर ले लिया। सिर्फ एक कमांड नाम लिखना बहुत स्पष्ट नहीं है।
mwfearnley

1

इसे इस्तेमाल करे:

function pause(){
   read -p "$*"
}

1
क्या कोई यह समझा सकता है कि यह नीचा क्यों है? क्या यह सामग्री की कमी के लिए है या यह एक बुरा समाधान है?
3ocene

4
@ 3ocene यह बनाए गए फ़ंक्शन का उपयोग नहीं दिखाता है; इसके अलावा किसी भी स्पष्टीकरण की कमी है।
स्वर्गवास

माना। क्या आप कृपया एक उदाहरण दिखा सकते हैं कि यह फ़ंक्शन कैसे लागू किया जाता है?
एसडीसोलर

1

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

# 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महान न्याय के लिए रखो !


0

उपयोग करने के लिए हाँ read- और इसमें दो जोड़े हैं जो इसे cronऔर टर्मिनल दोनों में सबसे अधिक उपयोगी बनाते हैं ।

उदाहरण:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-N 120 रीड स्टेटमेंट समय को 2 मिनट के बाद बाहर कर देता है ताकि यह अंदर ब्लॉक न हो cron

टर्मिनल में यह देखने के लिए 2 मिनट का समय देता है कि rsyncकमांड को निष्पादित करने में कितना समय लगा।

फिर बाद echoहै इसलिए अगली पंक्ति में बाद का बैश प्रॉम्प्ट दिखाई देगा।

अन्यथा यह "जारी ..." के बाद सीधे उसी लाइन पर दिखाई देगा जब Enterटर्मिनल में दबाया जाता है।

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