Trykk på mellomrom for å fortsette

Hvordan stopper jeg et bash-skript til en bruker har trykket på Mellomrom ?

Jeg vil gjerne ha spørsmålet i skriptet mitt

Trykk på mellomrom for å fortsette eller CTRL + C for å avslutte

og deretter skal skriptet stoppe og vente til Space trykkes.

Kommentarer

Svar

Du kan bruke 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 

Erstatt " " for mellomrom over med "" for Enter-tast, $"\t" for Tab-tast.

Kommentarer

  • Du bør legge til-for å ikke skrive ut det trykte tegnet på terminalen. Og legg til en linjeskift på slutten, ellers vil produksjonen fortsette direkte i samme linje som spørsmålet. Best ville være: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Dette skriptet fungerer ikke ‘ t. Bare testet den på Red Hat linux … else blokken kjører alltid, selv når du trykker på mellomromstasten.
  • @robert It ‘ fordi du ikke ‘ t bruker bash. Det fungerer hvis du bruker read _ i stedet, hvis du har et annet skall enn bash.
  • Skal '' inneholder et mellomrom inne?
  • Dette leser fra STDIN, noe som vil føre til problemer gitt pipeline | script.sh Se dette svaret for en løsning.

Svar

Metoden diskutert i denne SO Q & A er sannsynligvis den beste kandidaten for et alternativ til pause atferd som du er vant til på Windows når gjør BAT-filer.

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

Eksempel

Her kjører jeg ovennevnte og trykker ganske enkelt på en hvilken som helst tast, i dette tilfellet D nøkkel.

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

Referanser

Kommentarer

  • Jeg mener hvorfor $ befo re strengen her: -rsp $'Press?
  • @ rubo77 – ah. At ‘ er hvordan du kan lage en bokstavelig streng med spesialtegn. Det ‘ s av skjemaet: $ ‘ … ‘
  • @ rubo77 – at ‘ er forskjellig. At ‘ er et dollartegn med doble anførselstegn, brukte jeg en dollar med et enkelt anførselstegn. Slett den kommentaren, den ‘ er feil.
  • Ah, jeg forstår. I tilfelle du setter rømte sekvenser i ledeteksten. se wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – ja at notasjonen gjør det mulig å inkludere rømningssekvenser uten ekstra echo -e "..." linjer. Det ‘ er mye mer kompakt i de situasjonene.

Svar

Du kan opprette en funksjon for den:

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

Så kan du bruke dette overalt i skriptet:

pause 

Kommentarer

  • hvis du ikke har brukt shell-scripting – må du sette funksjonen øverst i skriptet før du bruker det

Svar

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" 

Dette skriver nå ut en melding uten en etterfølgende ny linje, håndterer CTRL+C pålitelig, påkaller stty bare så ofte som nødvendig, og gjenoppretter den kontrollerende ttyen til nøyaktig den tilstanden der stty fant den. Se på man stty for informasjon om hvordan du eksplisitt styrer ekko, kontrolltegn og alt.

Du kan også gjøre dette:

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 

Du kan gjøre det med ENTER, ingen [ tester ] og ingen stty som:

sed -n q </dev/tty 

Kommentarer

  • De to siste løsningene ser ut til å fungere bra med /bin/sh (f.eks. på FreeBSD) også, ikke bare med bash.
  • er svaret ditt på SO tilsvarende, eller enda bedre?

Svar

Her «på en måte som fungerer i begge bash og zsh, og sørger for at jeg / ut til terminalen:

# 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 

Legg den i .{ba,z}shrc for stor rettferdighet!

Svar

lat liner:

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

ulempen er at du mister kontrollen når brukeren trykker på ctrl + c. Skriptet vil alltid avslutte med kode 130 i så fall.

Svar

Innstillinger IFS til tom streng undertrykker leses standardadferd for å trimme hvitt mellomrom.

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 

OPPDATERING 05-05-23: Vi kan forenkle dette ved å bruke SVAR-variabelen, som ikke er gjenstand for splitting av ord:

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 

Svar

Her «er en enkel løsning fra Trykk på SPACE for å fortsette (ikke ENTER)

read -s -d " "

Dette venter til du trykker på mellomromstasten. Ja, bare mellomromstasten, den vil ikke gå i stykker hvis du trykker på enter.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *