2015-12-24 15 views
7

में निरस्त करने के लिए कोई भी कुंजी दबाएं हाय मैं एक ऐसी घटना को कार्यान्वित करने की कोशिश कर रहा हूं जो 5 सेकंड उलटी गिनती के बाद होगा, जब तक कोई कुंजी दबाया न जाए। मैं इस कोड का उपयोग कर रहा हूं, लेकिन अगर मैं एंटर या स्पेस दबाता हूं तो यह विफल रहता है। यह इस अर्थ में विफल रहता है कि प्रवेश या स्थान "" के रूप में पता चला है।5 सेकंड

echo "Phoning home..." 
key="" 
read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key 
echo 
if [ "$key" = "" ]  # No Keypress detected, phone home. 
    then python /home/myuser/bin/phonehome.py 
    else echo "Aborting." 
fi 

इस पोस्ट पढ़ने के बाद, Bash: Check if enter was pressed

मैं छोड़ दिया और यहां पोस्ट। मुझे लगता है कि मैंने जो कार्यान्वित करने की कोशिश की है उससे बेहतर तरीका होना चाहिए।

+2

क्या होता है यदि आप कुंजी के लिए शीर्ष पर एक डमी मान सेट करते हैं, यानी 'key = nonesuch'? सौभाग्य। – shellter

+0

यह वास्तव में एक अच्छा विचार है। धन्यवाद!!! – inkman

उत्तर

2

accepted answerlinked question में "का पता लगाने enter" सवाल के घटक शामिल हैं। आप read से बाहर निकलने वाले कोड को देखते हैं।

रिक्त स्थान को संभालने के लिए दो जवाब हैं।

अंतरिक्ष के साथ समस्या यह है कि सामान्य परिस्थितियों में read दिए गए चरों में इनपुट निर्दिष्ट करते समय इनपुट (और शब्द-विभाजन को इनपुट) से सफेद और पीछे की ओर घुमाते हैं।

इससे बचने के दो तरीके हैं।

  1. आप एक कस्टम नामित चर का उपयोग कर से बचने और बजाय $REPLY उपयोग कर सकते हैं। $REPLY को निर्दिष्ट करते समय कोई व्हाइटस्पेस ट्रिमिंग या वर्ड-स्प्लिटिंग नहीं किया जाता है। (इस की तलाश में अभी-अभी मैं वास्तव में इस POSIX में मिल नहीं कर सकते हैं हालांकि तो यह किसी प्रकार की एक गैर मानक और/या गैर पोर्टेबल विस्तार हो सकता है विशेषताएं।)

  2. स्पष्ट रूप से एक रिक्त स्ट्रिंग पर IFS सेट read कमांड के लिए, इसलिए यह निष्पादित नहीं करता है और व्हाइटस्पेस ट्रिमिंग या वर्ड-स्प्लिटिंग करता है।

    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Press <space> 
    0 
    $ declare -p key 
    declare -- k=" " 
    $ unset -v k 
    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Wait 
    1 
    $ declare -p key 
    -bash: declare: k: not found 
    
4

read मैनुअल का कहना है:

read के बदले कोड शून्य है, जब तक कि अंत फ़ाइल का सामना करना पड़ा या बार सुनाया जाता है।

आपके मामले में, जब उपयोगकर्ता अनुमति के समय में किसी भी कुंजी को हिट करता है तो आप आगे बढ़ना चाहते हैं।

#!/bin/bash 
if read -r -s -n 1 -t 5 -p "TEST:" key #key in a sense has no use at all 
then 
    echo "aborted" 
else 
    echo "continued" 
fi 

संदर्भ: Read Manual
नोट: प्रशस्ति पत्र में जोर मेरा है।

+0

इस तरह से सबसे सुरुचिपूर्ण लग रहा था और इस तरह से मैंने इसे समाप्त कर दिया। प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। – inkman

+0

@inkman: आपका स्वागत है दोस्त। – sjsam

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