Pokračujte stisknutím mezerníku

Jak zastavím bash skript, dokud uživatel nestiskne mezeru ?

Chtěl bych mít otázku ve svém skriptu

Pokračujte stisknutím mezery nebo CTRL + C pro ukončení

a poté by se měl skript zastavit a počkat, až bude stisknuto Space.

Komentáře

Odpověď

Můžete použít 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 

Nahraďte " " pro prostor nahoře za "" pro klávesu Enter, $"\t" pro klávesu Tab.

Komentáře

  • Měli byste přidat -s, abyste nevytiskli vylisovaný znak na terminálu. A na konec přidejte konec řádku, jinak bude výstup pokračovat přímo ve stejném řádku, jako je otázka. Nejlepší by bylo: read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
  • Tento skript nefunguje ‚. Právě jsme to otestovali na Red Hat linux … Blok else se vždy spustí, i když stisknete mezerník.
  • @robert It ‚ s protože ‚ nepoužíváte bash. Funguje to, pokud místo toho použijete read _, pokud máte jiný shell než bash.
  • Pokud by '' obsahují uvnitř mezeru?
  • Toto čte z STDIN, což způsobí problémy dané pipeline | script.sh Viz tato odpověď pro řešení.

Odpověď

Metoda diskutováno v tomto SO Q & A je pravděpodobně nejlepším kandidátem na alternativu k chování pause, na které jste zvyklí ve Windows, když dělá soubory BAT.

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

Příklad

Zde používám výše uvedené a pak jednoduše stisknu libovolnou klávesu, v tomto případě Klíč D .

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

Reference

Komentáře

  • Chci říct, proč $ před Zde naleznete řetězec: -rsp $'Press?
  • @ rubo77 – ach. Takto ‚ můžete dělat doslovný řetězec se speciálními znaky. Je ‚ s ve formě: $ ‚ … ‚
  • @ rubo77 – to ‚ se liší. To ‚ s znakem dolaru s dvojitými uvozovkami jsem použil dolar s jednoduchými uvozovkami. Smažte prosím tento komentář, je ‚ špatný.
  • Aha, rozumím. V případě, že do řetězce výzvy vložíte uniklé sekvence. viz wiki.bash-hackers.org/syntax/quoting#ansi_c_like_strings
  • @ rubo77 – ano, notace umožňuje zahrnout únikové sekvence bez jakýchkoli dalších echo -e "..." řádků. V těchto situacích je ‚ mnohem kompaktnější.

Odpovědět

Můžete pro to vytvořit funkci:

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

Tuto funkci pak můžete použít všude ve svém skriptu:

pause 

Komentáře

  • pokud jste skriptování v prostředí Shell noví – před použitím skriptu musíte tuto funkci umístit do horní části skriptu

Odpověď

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" 

Tím se vytiskne výzva bez koncového nového řádku, zpracovává CTRL+C spolehlivě, vyvolává stty jen tak často, jak je to nutné, a obnovuje řídící tty přesně do stavu, ve kterém stty našel. Podívejte se do man stty, kde najdete informace o tom, jak explicitně ovládat ozvěny, řídicí znaky a vše ostatní.

Můžete také udělat toto:

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 

Dalo by se to s ENTER, žádnými [ testy ] a žádné stty lajky:

sed -n q </dev/tty 

Komentáře

  • Zdá se, že vaše dvě poslední řešení fungují dobře i s /bin/sh (např. na FreeBSD), nejen s bash.
  • je vaše odpověď na SO ekvivalent, nebo ještě lepší?

Odpověď

Tady je způsob, který funguje v obou bash and zsh a zajišťuje I / O do terminálu:

# 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 

Vložte jej do .{ba,z}shrc pro Velkou spravedlnost!

Odpověď

líná jedna linka:

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

Nevýhodou je, že ztratíte kontrolu, když uživatel stiskne ctrl + c. Skript v takovém případě vždy ukončí kód 130.

Odpovědět

Nastavení IFS na prázdný řetězec potlačí výchozí chování ořezávání mezer.

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: Můžeme to zjednodušit pomocí proměnné REPLY, která nepodléhá rozdělení slov:

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 

Odpověď

Zde je jednoduché řešení z Pokračujte stisknutím MEZERNÍKU (nikoli VSTUP)

read -s -d " "

Toto počká, dokud nestisknete mezerník. Ano, pouze mezerník, nerozbije se, pokud stisknete klávesu Enter.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *