it-swarm-eu.dev

Co je to Linux ekvivalentní DOS pauze?

Mám skript Bash Shell, ve kterém bych chtěl pozastavit provádění, dokud uživatel nestiskne klávesu. V DOSu, toto je snadno provedeno s “pauzou” příkaz. Je v mém skriptu možné použít ekvivalent Linuxu?

212
jt.

read toto:

[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$ 

-n1 určuje, že čeká pouze na jeden znak. -r vloží do syrového režimu, což je nezbytné, protože jinak, pokud stisknete něco jako zpětné lomítko, nezaregistruje se, dokud nestisknete další klíč. -p specifikuje Prompt, který musí být citován, pokud obsahuje mezery. Argument key je nutný pouze v případě, že chcete vědět, který klíč stiskli. V takovém případě k němu můžete přistupovat prostřednictvím $key.

Pokud používáte Bash, můžete také zadat časový limit s -t, který způsobí, že čtení nebude fungovat, pokud není stisknuto žádné tlačítko. Tak například:

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi
306
Jim

Používám tyto způsoby hodně, které jsou velmi krátké, a jsou jako @ theunamedguy a @Jim řešení, ale s timeout a tichý režim navíc.

Zvláště miluji poslední případ a používám ho v mnoha skriptech, které běží ve smyčce, dokud uživatel nestiskne Enter.

Příkazy

  • Zadejte řešení

    read -rsp $'Press enter to continue...\n'
    
  • Únikové řešení (s -d $ 'e')

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • Jakékoliv klíčové řešení (s -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • Otázka s přednastavenou volbo (s -ei $ 'Y')

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • Timeout řešení (s -t 5)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • Alias ​​rozšířeného spánk

    read -rst 0.5; timeout=$?
    # echo $timeout
    

Vysvětlení

- r specifikuje surový režim, který neumožňuje kombinované znaky jako "" nebo "^".

- s specifikuje tichý režim a protože nepotřebujeme výstup z klávesnice.

- p $ ' Prompt ' specifikuje výzvu, která musí být mezi $ 'a' pro povolení mezer a uniklých znaků . Buďte opatrní, musíte umístit mezi jednotlivé uvozovky symbolem dolarů, abyste mohli využít uniklé postavy, jinak můžete použít jednoduché uvozovky.

- d $ ' e ' specifikuje escappe jako oddělovač, takže jako konečný znak pro aktuální záznam je to možné dát jakýkoliv znak, ale dávat pozor, aby postava, kterou uživatel může zadat.

- n 1 určuje, že potřebuje pouze jeden znak.

- e specifikuje režim readline.

- i $ 'Y' specifikuje Y jako počáteční text v režimu readline.

- t 5 určuje časový limit 5 sekund

klíč slouží v případě, že potřebujete znát vstup, v případě -n1, stisknutou klávesu.

$? slouží k poznání výstupního kódu posledního programu, pro čtení 142 v případě časového limitu, 0 správného vstupu. Dejte $? v proměnné co nejdříve, pokud ji potřebujete otestovat po somes příkazech, protože všechny příkazy by přepsaly $?

146
y.petremann

To pro mě fungovalo na několika příchutích Linuxu, kde některá z těchto dalších řešení (včetně těch nejoblíbenějších) zde nebyla. Myslím, že je to také lépe čitelné ...

echo Press enter to continue; read dummy;

Proměnná musí být uvedena jako argument read.

13
BuvinJ

read bez parametrů bude pokračovat pouze po stisknutí klávesy enter. Příkaz DOS pause bude pokračovat, pokud stisknete libovolnou klávesu. Pokud chcete toto chování použít, použijte read –n1.

12
xsl

read -n1 není přenosný. Přenosný způsob, jak to udělat, může být:

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

Kromě použití read, pro pouhé stisknutí ENTER pro pokračování Prompt můžete udělat:

sed -n q </dev/tty
8
mikeserv

Pokud potřebujete pouze pozastavit smyčku nebo skript, a jste šťastní, že stisknete klávesu Enter namísto jakéhokoli klíče, pak read sám provede svou práci.

do_stuff
read
do_more_stuff

Není to přátelský pro koncového uživatele, ale může to stačit v případech, kdy píšete rychlý skript pro sebe, a musíte jej pozastavit, abyste něco udělali ručně na pozadí.

2
mwfearnley

Tato funkce funguje jak v bash, tak zsh a zajišťuje I/O 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

Dej to do .{ba,z}shrc pro Velkou spravedlnost!

1
Tom Hale

Ano pro použití read - a existuje několik vylepšení, která ho činí nejužitečnějším jak v cron, tak v terminálu.

Příklad:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-N 120 zpřístupní příkaz pro čtení po 2 minutách, takže v souboru cron neblokuje.

V terminálu dává 2 minuty na to, jak dlouho příkaz rsync provedl.

Pak následný echo je tak následující bash Prompt se objeví na dalším řádku.

Jinak se zobrazí na stejném řádku přímo po "pokračovat ..." kdy Enter v terminálu.

0
SDsolar