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
- Toate acestea și multe altele sunt abordate în acest SO Q & A BTW: Ce este echivalentul Linux pentru a întrerupe DOS?
- Vedeți și: Întrerupeți scriptul Shell până când apăsați Enter în buclă
- related: unix.stackexchange.com/questions/293940/…
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 schimbread _
, dacă aveți alt shell decâtbash
. - 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.