Apăsați spațiu pentru a continua

Cum opresc un script bash până când un utilizator a apăsat Spațiu ?

Aș dori să am întrebarea în scriptul meu

Apăsați spațiu pentru a continua sau CTRL + C pentru a ieși

și apoi scriptul ar trebui să se oprească și să aștepte până când spațiul este apăsat.

Comentarii

Răspuns

Puteți utiliza 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 

Înlocuiți " " pentru spațiul de mai sus cu "" pentru tasta Enter, $"\t" pentru tasta Tab.

Comentarii

  • Ar trebui să adăugați -s pentru a nu imprima caracterul apăsat pe terminal. Și adăugați o linie la sfârșit, sau rezultatul va continua direct în aceeași linie ca întrebarea. Cel mai bun ar fi: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Acest script nu funcționează ‘. Tocmai l-am testat pe Red Hat Linux … Blocul else rulează întotdeauna, chiar și atunci când este apăsată bara de spațiu.
  • @robert It ‘ s pentru că nu ‘ nu utilizați bash. Funcționează dacă utilizați în schimb read _, dacă aveți alt shell decât bash.
  • Ar trebui ca '' conține un spațiu în interior?
  • Aceasta citește din STDIN, ceea ce va cauza probleme date pipeline | script.sh A se vedea acest răspuns pentru o soluție.

Răspuns

Metoda discutat în acest SO Q & A este probabil cel mai bun candidat pentru o alternativă la comportamentul pause cu care sunteți obișnuit pe Windows când făcând fișiere BAT.

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

Exemplu

Aici rulez cele de mai sus și apoi pur și simplu apăsând orice tastă, în acest caz D cheie.

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

Referințe

Comentarii

  • Adică de ce $ befo introduceți șirul aici: -rsp $'Press?
  • @ rubo77 – ah. ‘ este modul în care puteți face un șir literal cu caractere speciale. Este ‘ s de forma: $ ‘ … ‘
  • @ rubo77 – diferența dintre ‘. ‘ este un semn de dolar cu ghilimele duble, am folosit un dolar cu ghilimele simple. Ștergeți comentariul respectiv, este ‘ greșit.
  • Ah, înțeleg. În cazul în care puneți secvențe evadate în interiorul șirului de prompturi. vezi wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – da, această notare permite includerea secvențelor de evadare fără alte echo -e "..." linii suplimentare. ‘ este mult mai compact în aceste situații.

Răspuns

Puteți crea o funcție pentru aceasta:

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

Apoi îl puteți folosi oriunde în scriptul dvs.:

pause 

Comentarii

  • dacă sunteți nou în shell scripting – trebuie să puneți funcția în partea de sus a scriptului înainte de a-l utiliza

Răspuns

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" 

Acum se imprimă un prompt fără o linie nouă, gestionează CTRL+C în mod fiabil, invocă stty numai de câte ori este necesar și restabilește tty-ul de control exact la starea în care stty l-a găsit. Căutați în man stty pentru informații despre cum să controlați în mod explicit ecourile, caracterele de control și toate acestea.

De asemenea, ați putea face acest lucru:

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 

Puteți face acest lucru cu ENTER, fără [ teste ] și niciun stty ca:

sed -n q </dev/tty 

Comentarii

  • Ultimele dvs. soluții par să funcționeze bine cu /bin/sh (de exemplu, pe FreeBSD), nu numai cu bash.
  • este răspunsul dvs. pe SO echivalent, sau chiar mai bun?

Răspuns

Aici „un mod care funcționează în ambele bash și zsh și asigură I / O terminalului:

# 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 

Puneți-l în .{ba,z}shrc pentru Marea Justiție!

Răspuns

leneș o linie:

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

dezavantajul este că pierzi controlul atunci când utilizatorul apasă ctrl + c. Scriptul va ieși întotdeauna cu codul 130 în acest caz.

Răspuns

Setări IFS pentru șirul gol elimină comportamentul implicit al cititului de tăiere a spațiului alb.

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 

UPDATE 2018-05-23: Putem simplifica acest lucru folosind variabila REPLY, care nu este supusă divizării cuvintelor:

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 

Răspuns

Aici „o soluție simplă din Apăsați SPACE pentru a continua (nu ENTER)

read -s -d " "

Aceasta va aștepta până când apăsați bara de spațiu. Da, doar bara de spațiu, nu s-ar rupe dacă ați apăsa Enter.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *