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.sh
Katso tämä vastaus ratkaisua varten.