Antworten:
read
macht dies:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
Das -n1
gibt an, dass nur auf ein einzelnes Zeichen gewartet wird. Das -r
versetzt es in den Raw-Modus, was notwendig ist, da es sonst erst registriert wird, wenn Sie so etwas wie einen Backslash drücken, wenn Sie die nächste Taste drücken. Das -p
gibt die Eingabeaufforderung an, die in Anführungszeichen gesetzt werden muss, wenn sie Leerzeichen enthält. Das key
Argument ist nur erforderlich, wenn Sie wissen möchten, welche Taste sie gedrückt haben. In diesem Fall können Sie darauf zugreifen $key
.
Wenn Sie Bash verwenden, können Sie auch eine Zeitüberschreitung mit angeben -t
, die dazu führt, dass das Lesen einen Fehler zurückgibt, wenn eine Taste nicht gedrückt wird. Also zum Beispiel:
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
Press a key to continue...
auch Anfänger die a
Taste finden und drücken; o)
command | myscript.sh
oder haben myscript.sh | command
. In dieser Antwort finden Sie eine Lösung.
read: 1: read: Illegal option -n
stellen Sie sicher, dass Sie Ihren Befehl bash -c 'command && command'
usw. einschließen, da dieser Fehler wahrscheinlich von kommt sh
. Ich mache das in einem Lando-Wrapper-Befehl.
Ich benutze diese Methoden sehr oft, die sehr kurz sind und wie @ theunamedguy- und @ Jim-Lösungen aussehen, aber zusätzlich mit Timeout und Silent-Modus.
Ich mag besonders den letzten Fall und verwende ihn in vielen Skripten, die in einer Schleife ausgeführt werden, bis der Benutzer drückt Enter.
Lösung eingeben
read -rsp $'Press enter to continue...\n'
Escape-Lösung (mit -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
Beliebige Schlüssellösung (mit -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
Frage mit vorausgewählter Auswahl (mit -ei $ 'Y')
read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
# echo $key
Timeout-Lösung (mit -t 5)
read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
Schlafverbesserter Alias
read -rst 0.5; timeout=$?
# echo $timeout
-r gibt den Rohmodus an, der keine kombinierten Zeichen wie "\" oder "^" zulässt.
-s gibt den stillen Modus an und weil wir keine Tastaturausgabe benötigen.
-p $ ' prompt ' gibt die Eingabeaufforderung an, die zwischen $ 'und' liegen muss, um Leerzeichen und maskierte Zeichen zuzulassen. Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollarsymbol setzen, um maskierte Zeichen zu erhalten. Andernfalls können Sie einfache Anführungszeichen verwenden.
-d $ ' \ e ' gibt escappe als Trennzeichen an. Als endgültiges Zeichen für den aktuellen Eintrag können Sie also jedes beliebige Zeichen einfügen. Achten Sie jedoch darauf, ein Zeichen einzugeben, das der Benutzer eingeben kann.
-n 1 gibt an, dass nur ein einziges Zeichen benötigt wird.
-e gibt den Readline-Modus an.
-i $ ' Y ' gibt Y als Anfangstext im Readline-Modus an.
-t 5 gibt eine Zeitüberschreitung von 5 Sekunden an
Taste dient für den Fall, dass Sie die Eingabe kennen müssen, in -n1 Fall die Taste, die gedrückt wurde.
$? dienen dazu, den Exit-Code des letzten Programms zu kennen, zum Lesen, 142 im Falle einer Zeitüberschreitung, 0 korrekte Eingabe. $ Setzen? in einer Variablen so schnell wie möglich, wenn Sie sie nach einigen Befehlen testen müssen, weil alle Befehle $?
-s
; man read
und read --help
Hilfe hat unter Ubuntu 10.04.1 LTS nicht geholfen. Bearbeiten: help read
tat; ist der Rest veraltet?
read: -i: invalid option
für die Ex. read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
auf #osx read -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
funktioniert stattdessen für mich. `
-i
funktioniert perfekt unter Ubuntu. Außerdem weiß ich nicht, wie es unter OSX -d
genauso funktioniert.
Dies funktionierte für mich bei mehreren Linux-Varianten, bei denen einige dieser anderen Lösungen dies nicht taten (einschließlich der beliebtesten hier). Ich denke, es ist auch besser lesbar ...
echo Press enter to continue; read dummy;
Beachten Sie, dass eine Variable als Argument für angegeben werden muss read
.
read -n1
ist nicht tragbar. Ein tragbarer Weg, um dasselbe zu tun, könnte sein:
( trap "stty $(stty -g;stty -icanon)" EXIT
LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
) </dev/tty
Abgesehen von der Verwendung read
können Sie nur eine ENTER
Taste drücken, um fortzufahren:
sed -n q </dev/tty
status=none
ist auch nicht tragbar. Leiten Sie stattdessen stdout und stderr nach / dev / null um. read -r line < /dev/tty
sein enought würde ENTER drücken ... .
settings=$(stty -g); stty raw; dd ...; stty "$settings"
, um die tty-Einstellungen zu speichern und wiederherzustellen.
tr
Bearbeitungssache auch funktionieren könnte?
tr
die Ausgabe als Pipe gepuffert würde und Tastaturen außerhalb der USA Tasten haben, die Zeichen außerhalb des \1-\177
Bereichs senden . dd
ist der idiomatische Weg hier.
Wenn Sie nur eine Schleife oder ein Skript anhalten müssen und anstelle einer beliebigen Taste die Eingabetaste drücken möchten, read
erledigt dies die Aufgabe von alleine.
do_stuff
read
do_more_stuff
Es ist nicht endbenutzerfreundlich, kann aber in Fällen ausreichen, in denen Sie ein schnelles Skript für sich selbst schreiben und es anhalten müssen, um etwas manuell im Hintergrund zu tun.
Versuche dies:
function pause(){
read -p "$*"
}
Diese Funktion funktioniert sowohl in bash
als zsh
auch und stellt die E / A für das Terminal sicher:
# 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
Legen Sie es in Ihre .{ba,z}shrc
für große Gerechtigkeit!
Ja zur Verwendung read
- und es gibt einige Verbesserungen, die es sowohl cron
im Terminal als auch im Terminal am nützlichsten machen .
Beispiel:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
Mit dem -n 120 tritt nach 2 Minuten eine Zeitüberschreitung für die Leseanweisung auf, sodass sie nicht blockiert cron
.
Im Terminal dauert es 2 Minuten, um zu sehen, wie lange die rsync
Ausführung des Befehls gedauert hat.
Dann echo
wird die nachfolgende Bash-Eingabeaufforderung in der nächsten Zeile angezeigt.
Andernfalls wird es direkt nach "Weiter ..." in derselben Zeile angezeigt, wenn Enterim Terminal gedrückt wird.
"Enter any non-NUL character to continue"
. Einige Tasten senden Sie keine Zeichen (wieCtrl
...) und einige senden mehr als ein (wieF1
,Home
...).bash
ignoriert NUL-Zeichen.