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
- Alt dette og mere behandles i denne SO Q & En BTW: Hvad er linuxækvivalenten til DOS-pause?
- Se også: Sæt shell-script på pause, indtil tryk på Enter i mens loop
- relateret: unix.stackexchange.com/questions/293940/…
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
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.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
blokken kører altid, selv når der trykkes på mellemrumstasten.bash
. Det fungerer, hvis du brugerread _
i stedet, hvis du har en anden skal endbash
.''
indeholder et mellemrum inde?pipeline | script.sh
Se dette svar til en løsning.