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
- Alt dette og mer er adressert i denne SO Q & A BTW: Hva er linux-ekvivalenten til DOS-pause?
- Se også: Sett Shell-skript på pause til Trykk Enter i mens loop
- relatert: unix.stackexchange.com/questions/293940/…
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
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.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
blokken kjører alltid, selv når du trykker på mellomromstasten.bash
. Det fungerer hvis du brukerread _
i stedet, hvis du har et annet skall ennbash
.''
inneholder et mellomrom inne?pipeline | script.sh
Se dette svaret for en løsning.