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
- Kaikki tämä ja paljon muuta on käsitelty tässä SO Q & A BTW: Mikä on linux-ekvivalentti DOS-taukoon?
 - Katso myös: Keskeytä komentotulkkikomento, kunnes paina Enter sisään silmukan aikana
 - liittyvät: unix.stackexchange.com/questions/293940/…
 
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
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.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'else-lohko toimii aina, vaikka välilyöntinäppäintä painetaan.bash. Se toimii, jos käytät sen sijaanread _, jos sinulla on jokin muu kuori kuinbash.''sisältää välilyönnin?pipeline | script.shKatso tämä vastaus ratkaisua varten.