devam etmek için boşluk tuşuna basın


73

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.


Bütün bunlar ve daha fazlası bu SO Q&A BTW'sinde ele alınmaktadır: DOS duraklamasına eşdeğer linux nedir?
slm


Yanıtlar:


58

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

12
Bastırılan karakteri terminalde yazdırmamak için -s eklemelisiniz. Ve sonunda bir satır sonu ekleyin, yoksa çıktı doğrudan soru ile aynı satırda devam eder. En iyi olurdu:read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
rubo77

1
Bu komut dosyası çalışmıyor. Sadece Red Hat linux üzerinde test edildi ... elseBlok daima boşluk çubuğuna basılsa bile çalışır.
robert

3
@robert Kullanmadığınız için bash. Bunun read _yerine kullanırsanız, bunun dışında başka bir kabuğunuz varsa çalışır bash.
Niklas Rosencrantz

''İçerisinde boşluk olmalı mı ?
Jose Antonio Dura Olmos,

Bu ''boş bir dize içindir. İçeride boşluk yok. Sanırım, aynı zamanda, ENTER veya TAB girerseniz de uyuyor
rubo77

44

Bu SO Q&A'da tartışılan yöntem muhtemelen pauseBAT 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

Örnek

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...
$ 

Referanslar


Yani neden $burada dize önce: -rsp $'Press?
rubo77

2
@ rubo77 - ah. Özel karakterlerle hazır bilgi dizesini bu şekilde yapabilirsiniz. Bu form: $ '...'
slm

1
@ rubo77 - bu farklı. Bu bir çift işaretli w / dolar işareti, ben bir tek w / w dolar kullandım. Lütfen bu yorumu silin, yanlış.
slm

1
Ah, anlıyorum. İstenilen dizgenin içine kaçan diziler koymanız durumunda. bkz. wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
rubo77 7

@ rubo77 - evet, notasyon kaçış dizilerinin herhangi bir fazladan echo -e "..."çizgi olmadan dahil edilmesini sağlar . Bu durumlarda çok daha kompakt.
slm

6
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+Cgüvenilir bir şekilde işler , sttyyalnızca gerektiği kadar sık çağırır ve kontrol tty'sini bulunduğu duruma geri yükler stty. İçine bak man sttyaçı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 sttysevmeyebilirsin:

sed -n q </dev/tty

5

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

Eğer komut dosyası çalıştırma konusunda yeniyseniz - fonksiyonu kullanmadan önce betiğinizin en üstüne koymanız gerekir
Richard

3

tembel bir astar:

echo "Press any key to continue or Ctrl+C to cancel"
read && do_something.sh

Dezavantajı, kullanıcı ctrl + c tuşlarına bastığında kontrolü kaybetmenizdir. Bu durumda komut dosyası her zaman kod 130 ile çıkar.


2

IFSBoş 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

1

İşte hem çalışan bir yoldur bashve zshve 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}shrcBüyük Adalet için içine koy !

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.