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
- Tomuto všemu a dalšímu se věnuje tento SO Q & BTW: Co je ekvivalent linuxu pozastavit v systému DOS?
- Viz také: Pozastavit skript Shell, dokud ve smyčce nestisknete klávesu Enter
- související: unix.stackexchange.com/questions/293940/…
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
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.
read -n1 -rsp $'Press any key to continue or Ctrl+C to exit...\n'
else
se vždy spustí, i když stisknete mezerník.bash
. Funguje to, pokud místo toho použijeteread _
, pokud máte jiný shell nežbash
.''
obsahují uvnitř mezeru?pipeline | script.sh
Viz tato odpověď pro řešení.