Tryk på mellemrum for at fortsætte

Hvordan stopper jeg et bash-script, indtil en bruger har trykket på Mellemrum ?

Jeg vil gerne have spørgsmålet i mit script

Tryk på mellemrum for at fortsætte eller CTRL + C for at afslutte

og derefter skal scriptet stoppe og vente, indtil der trykkes på mellemrummet.

Kommentarer

Svar

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

Erstat " " for plads ovenover med "" for Enter-tasten, $"\t" for Tab-tasten.

Kommentarer

  • Du skal tilføje -s for ikke at udskrive det trykte tegn ud på terminalen. Og tilføj en linebreak i slutningen, ellers vil output fortsætte direkte i samme linje som spørgsmålet. Bedst ville være: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Dette script fungerer ikke ‘ t. Testede det lige på Red Hat linux … else blokken kører altid, selv når der trykkes på mellemrumstasten.
  • @robert It ‘ fordi du ikke ‘ t bruger bash. Det fungerer, hvis du bruger read _ i stedet, hvis du har en anden skal end bash.
  • Skulle '' indeholder et mellemrum inde?
  • Dette læser fra STDIN, hvilket vil forårsage problemer givet pipeline | script.sh Se dette svar til en løsning.

Svar

Metoden diskuteret i denne SO Q & A er sandsynligvis den bedste kandidat til et alternativ til pause adfærd, som du er vant til på Windows, når laver BAT-filer.

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

Eksempel

Her kører jeg ovenstående og trykker blot på en vilkårlig tast, i dette tilfælde D -tast.

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

Referencer

Kommentarer

  • Jeg mener hvorfor $ befo re strengen her: -rsp $'Press?
  • @ rubo77 – ah. At ‘ er, hvordan du kan lave en bogstavelig streng med specialtegn. Det ‘ s af formularen: $ ‘ … ‘
  • @ rubo77 – at ‘ er anderledes. At ‘ er et dollartegn med dobbelt anførselstegn, brugte jeg en dollar med et enkelt anførselstegn. Slet denne kommentar, den ‘ er forkert.
  • Ah, jeg forstår. Hvis du placerer undslapte sekvenser inde i prompt-strengen. se wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – ja, at notationen tillader, at escape-sekvenser inkluderes uden ekstra echo -e "..." linjer. Det ‘ er meget mere kompakt i disse situationer.

Svar

Du kan oprette en funktion til det:

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

Så kan du bruge dette overalt i dit script:

pause 

Kommentarer

  • hvis du er ny med shell-scripting – skal du placere funktionen øverst i dit script, før du bruger 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 udskriver nu en prompt uden en efterfølgende ny linje, håndterer CTRL+C pålideligt, påberåber stty kun så ofte som nødvendigt og gendanner den kontrollerende tty til nøjagtigt den tilstand, hvor stty fandt det. Se på man stty for at få oplysninger om, hvordan du eksplicit styrer ekko, kontroltegn og alt.

Du kan også gø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 gøre det med ENTER, ingen [ tests ] og ingen stty som:

sed -n q </dev/tty 

Kommentarer

  • Dine to sidste løsninger ser ud til at fungere fint med /bin/sh (f.eks. på FreeBSD), ikke kun med bash.
  • er dit svar på SO ækvivalent, eller endnu bedre?

Svar

Her “på en måde, der fungerer i begge bash og zsh og sikrer I / O 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 

Sæt det i din .{ba,z}shrc for stor retfærdighed!

Svar

lazy one liner:

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

ulempen er, at du mister kontrol, når brugeren trykker på ctrl + c. Scriptet afslutter i så fald altid med kode 130.

Svar

Indstillinger IFS til tom streng undertrykker læstes standardadfærd for at trimme hvidt mellemrum.

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: Vi kan forenkle dette ved at bruge variablen SVAR, der ikke er underlagt ordopdeling:

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 simpel løsning fra Tryk på MELLEMRUM for at fortsætte (ikke ENTER)

read -s -d " "

Dette venter, indtil du trykker på mellemrumstasten. Ja, kun mellemrumstasten, den bryder ikke, hvis du trykker på enter.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *