it-swarm.com.de

Was ist das Linux-Äquivalent zu DOS-Pause?

Ich habe ein Bash-Shell-Skript, in dem ich die Ausführung anhalten möchte, bis der Benutzer eine Taste drückt. In DOS ist dies mit dem Befehl "Pause" problemlos möglich. Gibt es ein Linux-Äquivalent, das ich in meinem Skript verwenden kann?

212
jt.

read macht das:

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

Der -n1 gibt an, dass nur auf ein einzelnes Zeichen gewartet wird. Der -r versetzt ihn in den Raw-Modus, was notwendig ist, da sich sonst, wenn Sie so etwas wie einen Backslash drücken, erst nach dem Drücken der nächsten Taste registriert. Der -p gibt die Aufforderung an, die in Anführungszeichen gesetzt werden muss, wenn sie Leerzeichen enthält. Das Argument key ist nur erforderlich, wenn Sie wissen möchten, welche Taste gedrückt wurde. In diesem Fall können Sie über $key darauf zugreifen.

Wenn Sie Bash verwenden, können Sie mit -t auch ein Timeout angeben, das dazu führt, dass Read einen Fehler zurückgibt, wenn keine Taste 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
306
Jim

Ich benutze diese Methoden oft sehr kurz und sie ähneln @theunamedguy- und @Jim-Lösungen, aber zusätzlich mit Timeout und Silent-Modus.

Ich liebe besonders den letzten Fall und benutze ihn in vielen Skripten, die in einer Schleife laufen, bis der Benutzer drückt Enter.

Befehle

  • Lösung eingeben

    read -rsp $'Press enter to continue...\n'
    
  • Fluchtlö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;
    
  • Sleep enhanced alias

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

Erläuterung

- r gibt den Rohmodus an, der keine kombinierten Zeichen wie "\" oder "^" zulässt.

- s spezifiziert den stillen Modus und weil wir keine Tastaturausgabe benötigen.

- p $ ' Eingabeaufforderung ' gibt die Eingabeaufforderung an, die zwischen $ 'und' liegen muss, um Leerzeichen und Escapezeichen zuzulassen . Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollarsymbol setzen, um die entkoppelten Zeichen zu unterstützen. Andernfalls können Sie einfache Anführungszeichen verwenden.

- d $ '\e ' spezifiziert escappe als Trennzeichen, so dass dies als abschließendes Zeichen für die aktuelle Eingabe möglich ist um ein beliebiges Zeichen zu setzen, aber seien Sie vorsichtig, um ein Zeichen zu setzen, das der Benutzer eingeben kann.

- n 1 gibt an, dass nur ein einzelnes 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 dienen 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 bei Timeout, 0 richtige Eingabe. $ Setzen? in einer Variablen so schnell wie möglich, wenn Sie es nach einigen Befehlen testen müssen, weil alle Befehle $?

146
y.petremann

Dies funktionierte für mich bei mehreren Linux-Varianten, bei denen einige dieser anderen Lösungen nicht vorhanden waren (einschließlich der beliebtesten hier). Ich finde es auch lesbarer ...

echo Press enter to continue; read dummy;

Beachten Sie, dass eine Variable als Argument für read angegeben werden muss.

13
BuvinJ

read ohne Parameter wird nur fortgesetzt, wenn Sie die Eingabetaste drücken . Der Befehl DOS pause wird fortgesetzt, wenn Sie eine beliebige Taste drücken. Verwenden Sie read –n1, wenn Sie dieses Verhalten wünschen.

12
xsl

read -n1 ist nicht portabel. Ein tragbarer Weg, das Gleiche 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

Neben der Verwendung von read können Sie durch Drücken von ENTER fortfahren.

sed -n q </dev/tty
8
mikeserv

Wenn Sie nur eine Schleife oder ein Skript anhalten müssen und Sie statt einer beliebigen Taste die Eingabetaste drücken, erledigt read die Aufgabe.

do_stuff
read
do_more_stuff

Es ist nicht für den Endbenutzer geeignet, kann aber ausreichend sein, wenn Sie ein schnelles Skript für sich selbst schreiben und es unterbrechen müssen, um manuell etwas im Hintergrund zu tun.

2
mwfearnley

Versuche dies:

function pause(){
   read -p "$*"
}
1
Alex Fort

Diese Funktion arbeitet sowohl in bash als auch in zsh und gewährleistet die E/A des Terminals:

# 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

Setzen Sie es in Ihren .{ba,z}shrc für Große Gerechtigkeit!

1
Tom Hale

Ja, um read zu verwenden - und es gibt ein paar Verbesserungen, die es sowohl in cron als auch im Terminal am nützlichsten machen.

Beispiel:

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

Das -n 120 bewirkt eine Zeitüberschreitung der Leseanweisung nach 2 Minuten, sodass cron nicht blockiert wird.

Im Terminal werden 2 Minuten benötigt, um festzustellen, wie lange die Ausführung des Befehls rsync gedauert hat.

Dann ist der nachfolgende echo so, dass die nachfolgende Bash-Eingabeaufforderung in der nächsten Zeile angezeigt wird.

Andernfalls wird es in derselben Zeile direkt nach "Weiter ..." angezeigt, wenn Enter wird im Terminal gedrückt.

0
SDsolar