Bir kullanıcı basana kadar bash betiğini nasıl durdurabilirim Space?
Senaryomda bir soru olmasını istiyorum
Devam etmek için boşluk , çıkmak için CTRL+ tuşuna basın.C
ve sonra komut dosyası durmalı ve Space tuşuna basılana kadar beklemelidir.
Bir kullanıcı basana kadar bash betiğini nasıl durdurabilirim Space?
Senaryomda bir soru olmasını istiyorum
Devam etmek için boşluk , çıkmak için CTRL+ tuşuna basın.C
ve sonra komut dosyası durmalı ve Space tuşuna basılana kadar beklemelidir.
Yanıtlar:
Kullanabilirsiniz 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
Blok daima boşluk çubuğuna basılsa bile çalışır.
bash
. Bunun read _
yerine kullanırsanız, bunun dışında başka bir kabuğunuz varsa çalışır bash
.
''
İçerisinde boşluk olmalı mı ?
''
boş bir dize içindir. İçeride boşluk yok. Sanırım, aynı zamanda, ENTER veya TAB girerseniz de uyuyor
Bu SO Q&A'da tartışılan yöntem muhtemelen pause
BAT dosyaları yaparken Windows'ta alışkın olduğunuz davranışa bir alternatif için en iyi adaydır .
$ read -rsp $'Press any key to continue...\n' -n1 key
Burada yukarıdakileri çalıştırıyorum ve sonra herhangi bir tuşa basıyorum, bu durumda Danahtar.
$ read -rsp $'Press any key to continue...\n' -n1 key
Press any key to continue...
$
$
burada dize önce: -rsp $'Press
?
echo -e "..."
çizgi olmadan dahil edilmesini sağlar . Bu durumlarda çok daha kompakt.
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"
Bu, takip eden yeni bir satır olmadan bir istemi yazdırır, CTRL+C
güvenilir bir şekilde işler , stty
yalnızca gerektiği kadar sık çağırır ve kontrol tty'sini bulunduğu duruma geri yükler stty
. İçine bak man stty
açıkça yankılarını, kontrol karakterleri ve tüm kontrol etme hakkında bilgi için bkz.
Bunu da yapabilirsiniz:
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
Yapabilirsin ENTER
, [
testler yapamazsın ]
ve stty
sevmeyebilirsin:
sed -n q </dev/tty
Bunun için bir işlev oluşturabilirsiniz:
pause(){
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
}
Ardından betiğinizin her yerinde bunu kullanabilirsiniz:
pause
IFS
Boş dizgiye ayarlar , okunan beyaz boşluk kırpma davranışını bastırır.
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
GÜNCELLEME 2018-05-23: Sözcük bölmeye tabi olmayan REPLY değişkenini kullanarak bunu basitleştirebiliriz:
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
İşte hem çalışan bir yoldur bash
ve zsh
ve terminale / O I sağlamaktadır:
# 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
Onu .{ba,z}shrc
Büyük Adalet için içine koy !