कोई दबाव दर्ज करने की आवश्यकता है
यहाँ एक लंबा, लेकिन पुन: प्रयोज्य और मॉड्यूलर दृष्टिकोण है:
- रिटर्न
0
= हां और 1
= नहीं
- कोई भी दबाव दर्ज करने की आवश्यकता नहीं है - सिर्फ एक चरित्र
- enterडिफ़ॉल्ट विकल्प को स्वीकार करने के लिए दबा सकते हैं
- चयन को बाध्य करने के लिए डिफ़ॉल्ट विकल्प को अक्षम कर सकते हैं
- दोनों के लिए काम करता है
zsh
और bash
।
दर्ज करते समय "नहीं" के लिए डिफ़ॉल्ट
ध्यान दें कि N
राजधानियां हैं। यहां डिफ़ॉल्ट को स्वीकार करते हुए प्रवेश दबाया गया है:
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]?
यह भी ध्यान दें, यह [y/N]?
स्वचालित रूप से जोड़ा गया था। डिफ़ॉल्ट "नहीं" स्वीकार किया जाता है, इसलिए कुछ भी प्रतिध्वनित नहीं होता है।
जब तक एक वैध प्रतिक्रिया नहीं दी जाती है, तब तक पुन: संकेत दें:
$ confirm "Show dangerous command" && echo "rm *"
Show dangerous command [y/N]? X
Show dangerous command [y/N]? y
rm *
दर्ज करते समय "हाँ" के लिए डिफ़ॉल्ट
ध्यान दें कि Y
पूंजीकृत है:
$ confirm_yes "Show dangerous command" && echo "rm *"
Show dangerous command [Y/n]?
rm *
ऊपर, मैंने बस एंटर दबाया, इसलिए कमांड चला।
कोई डिफ़ॉल्ट पर enter- की आवश्यकता है y
याn
$ get_yes_keypress "Here you cannot press enter. Do you like this"
Here you cannot press enter. Do you like this [y/n]? k
Here you cannot press enter. Do you like this [y/n]?
Here you cannot press enter. Do you like this [y/n]? n
$ echo $?
1
यहाँ, 1
या असत्य वापस किया गया था। में कोई पूंजीकरण नोट करें[y/n]?
कोड
# Read a single char from /dev/tty, prompting with "$*"
# Note: pressing enter will return a null string. Perhaps a version terminated with X and then remove it in caller?
# See https://unix.stackexchange.com/a/367880/143394 for dealing with multi-byte, etc.
function get_keypress {
local REPLY IFS=
>/dev/tty printf '%s' "$*"
[[ $ZSH_VERSION ]] && read -rk1 # Use -u0 to read from STDIN
# See https://unix.stackexchange.com/q/383197/143394 regarding '\n' -> ''
[[ $BASH_VERSION ]] && </dev/tty read -rn1
printf '%s' "$REPLY"
}
# Get a y/n from the user, return yes=0, no=1 enter=$2
# Prompt using $1.
# If set, return $2 on pressing enter, useful for cancel or defualting
function get_yes_keypress {
local prompt="${1:-Are you sure} [y/n]? "
local enter_return=$2
local REPLY
# [[ ! $prompt ]] && prompt="[y/n]? "
while REPLY=$(get_keypress "$prompt"); do
[[ $REPLY ]] && printf '\n' # $REPLY blank if user presses enter
case "$REPLY" in
Y|y) return 0;;
N|n) return 1;;
'') [[ $enter_return ]] && return "$enter_return"
esac
done
}
# Credit: http://unix.stackexchange.com/a/14444/143394
# Prompt to confirm, defaulting to NO on <enter>
# Usage: confirm "Dangerous. Are you sure?" && rm *
function confirm {
local prompt="${*:-Are you sure} [y/N]? "
get_yes_keypress "$prompt" 1
}
# Prompt to confirm, defaulting to YES on <enter>
function confirm_yes {
local prompt="${*:-Are you sure} [Y/n]? "
get_yes_keypress "$prompt" 0
}
info bash
: "लगभग हर उद्देश्य के लिए, शेल फ़ंक्शन उपनामों पर पसंद किए जाते हैं।"