उपयोगकर्ता द्वारा दबाए जाने तक मैं एक बैश स्क्रिप्ट कैसे रोक सकता हूं Space?
मैं अपनी स्क्रिप्ट में सवाल करना चाहूंगा
जारी रखने या बाहर निकलने के लिए CTRL+ दबाएँC
और फिर स्क्रिप्ट को रुकना चाहिए और तब तक इंतजार करना चाहिए जब तक स्पेस दबाया न जाए।
उपयोगकर्ता द्वारा दबाए जाने तक मैं एक बैश स्क्रिप्ट कैसे रोक सकता हूं Space?
मैं अपनी स्क्रिप्ट में सवाल करना चाहूंगा
जारी रखने या बाहर निकलने के लिए CTRL+ दबाएँC
और फिर स्क्रिप्ट को रुकना चाहिए और तब तक इंतजार करना चाहिए जब तक स्पेस दबाया न जाए।
जवाबों:
आप उपयोग कर सकते हैं 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
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
elseब्लॉक हमेशा चलता है, यहां तक कि जब स्पेसबार दबाया जाता है।
bash। यह काम करता है यदि आप read _इसके बजाय उपयोग करते हैं, यदि आपके पास कुछ अन्य शेल है bash।
''अंदर जगह होनी चाहिए ?
''एक खाली स्ट्रिंग के लिए है। अंदर कोई जगह नहीं। मुझे लगता है, यह भी फिट बैठता है, अगर आप
इस 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:?
echo -e "..."लाइनों को शामिल किया जाए। यह उन परिस्थितियों में बहुत अधिक कॉम्पैक्ट है।
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
आप इसके लिए एक समारोह बना सकते हैं:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
फिर आप अपनी स्क्रिप्ट में हर जगह इसका उपयोग कर सकते हैं:
pause
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
यहाँ एक तरीका है कि दोनों में काम करता है 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महान न्याय के लिए रखो !