Paina välilyöntiä jatkaaksesi

Kuinka pysäytän bash-komentosarjan, kunnes käyttäjä on painanut välilyönti ?

Haluaisin, että kysymys olisi komentosarjassa

Jatka painamalla välilyöntiä tai CTRL + C poistuaksesi

ja sitten komentosarjan tulisi pysähtyä ja odottaa, kunnes välilyöntiä painetaan.

Kommentit

vastaus

Voit käyttää read:

read -n1 -s -r -p $"Press space to continue...\n" 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 

Korvaa " " yllä olevan tilan kohdalla "" Enter-avaimelle, $"\t" sarkainnäppäimelle.

Kommentit

  • Sinun on lisättävä -s, jotta et tulosta painettua merkkiä päätelaitteeseen. Ja lisää rivinvaihto loppuun, muuten lähtö jatkuu suoraan samalla rivillä kuin kysymys. Paras olisi: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Tämä komentosarja ei toimi ’. Vain testannut sen Red Hat linuxilla … else -lohko toimii aina, vaikka välilyöntinäppäintä painetaan.
  • @robert It ’ s, koska et ’ käytä bash. Se toimii, jos käytät sen sijaan read _, jos sinulla on jokin muu kuori kuin bash.
  • Pitäisikö '' sisältää välilyönnin?
  • Tämä lukee STDIN: stä, mikä aiheuttaa ongelmia, jotka on annettu pipeline | script.sh Katso tämä vastaus ratkaisua varten.

Vastaa

Menetelmä Tässä keskustelussa Q & A on todennäköisesti paras ehdokas vaihtoehdolle pause -käyttäytymiselle, johon olet tottunut Windowsissa, kun BAT-tiedostojen tekeminen.

$ read -rsp $"Press any key to continue...\n" -n1 key 

Esimerkki

Tässä suoritan ylläolevaa ja painan sitten mitä tahansa näppäintä, tässä tapauksessa D -näppäin.

$ read -rsp $"Press any key to continue...\n" -n1 key Press any key to continue... $ 

Viitteet

Kommentit

  • Tarkoitan miksi $ befo kirjoita merkkijono tähän: -rsp $'Press?
  • @ rubo77 – ah. Näin ’ s voit tehdä kirjaimellisen merkkijonon erikoismerkeillä. Se ’ s muodosta: $ ’ … ’
  • @ rubo77 – että ’ on erilainen. Että ’ on dollarin merkki ilman lainausmerkkejä, käytin dollaria w / yksittäisillä lainausmerkeillä. Poista kommentti, se ’ on väärä.
  • Ah, ymmärrän. Jos laitat pakenevat sekvenssit kehotteeseen. katso wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – kyllä, merkinnät mahdollistavat pakosarjojen sisällyttämisen ilman ylimääräisiä echo -e "..." rivejä. Se ’ on paljon kompaktimpi noissa tilanteissa.

Vastaa

Voit luoda sille toiminnon:

pause(){ read -n1 -rsp $"Press any key to continue or Ctrl+C to exit...\n" } 

Sitten voit käyttää tätä kaikkialla komentosarjassa:

pause 

Kommentit

  • jos olet uusi komentosarjojen komentosarja – sinun on lisättävä toiminto komentosarjan yläosaan ennen kuin käytät sitä

Vastaa

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" 

Tämä tulostaa nyt kehotteen ilman viimeistä uutta riviä, käsittelee CTRL+C luotettavasti, kutsuu stty -sovelluksen vain niin usein kuin tarpeen ja palauttaa hallitsevan tty: n tarkalleen tilaan, jossa stty löysi sen. man stty -sivulta saat tietoa kaikujen, merkkien ja kaiken nimenomaisesta ohjaamisesta.

Voit myös tehdä tämän:

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 

Voit tehdä sen ENTER, ei [ testejä ] eikä stty, kuten:

sed -n q </dev/tty 

kommentteja

  • Kaksi viimeistä ratkaisustasi näyttävät toimivan hyvin myös /bin/sh: n kanssa (esim. FreeBSD: llä), ei vain bashin kanssa.
  • on vastauksesi kohtaan SO vastaava, tai vielä parempi?

vastaus

Tässä on tapa, joka toimii molemmissa bash ja zsh ja varmistaa I / O: n päätelaitteelle:

# 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 

Laita se

suurelle oikeudenmukaisuudelle!

Vastaa

laiska yksi linja:

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

haittana on, että menetät hallinnan, kun käyttäjä painaa ctrl + c. Komentosarja poistuu aina koodilla 130 siinä tapauksessa.

Vastaa

Asetukset IFS merkkijonon tyhjentämiseksi estää lukemasi oletusarvon rajata tyhjää tilaa.

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 

PÄIVITYS 2018-05-23: Voimme yksinkertaistaa tätä käyttämällä REPLY-muuttujaa, joka ei kuulu sanojen jakamisen piiriin:

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 

Vastaa

Tässä on yksinkertainen ratkaisu kohteesta Jatka painamalla VÄLINÄPPÄINTÄ (ei ENTER)

read -s -d " "

Tämä odottaa, kunnes painat välilyöntiä. Kyllä, vain välilyönti, se ei katkea, jos painat Enter.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *