2008-09-18 8 views
180

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?Was ist das Linux-Äquivalent zu DOS-Pause?

Antwort

265

read tut dies:

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

Die -n1 gibt an, dass es nur für ein einzelnes Zeichen wartet. Die -r bringt es in den Raw-Modus, der notwendig ist, weil sonst, wenn Sie etwas wie Backslash drücken, es nicht registriert wird, bis Sie die nächste Taste drücken. Die -p gibt die Eingabeaufforderung 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 auch eine Zeitüberschreitung mit -t angeben. Dadurch wird beim Lesen ein Fehler zurückgegeben, wenn keine Taste gedrückt wird. So 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 
+2

Streng genommen wäre das "" Geben Sie ein beliebiges Nicht-NUL-Zeichen ein, um fortzufahren "'. Einige Tasten senden kein Zeichen (wie 'Ctrl' ...) und manche senden mehr als eins (wie' F1', 'Home' ...). 'bash' ignoriert NUL-Zeichen. –

+3

Wie cool. Dies wurde vor 8 Jahren und 9 Monaten gepostet und kam im Juli 2017 direkt in meine Google-Suche. Genau das, was ich brauchte! – SDsolar

-2

Try this:

function pause(){ 
    read -p "$*" 
} 
+0

Kann mir bitte jemand erklären, warum das nicht stimmt? Liegt es an mangelndem Inhalt oder ist das eine schlechte Lösung? – 3ocene

+1

@ 3ocene Dies zeigt nicht die Verwendung der Funktion, die erstellt wird; dazu fehlt jede Erklärung. – parvus

12

read ohne Parameter nur dann weiter, 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 möchten.

122

Ich benutze diese Möglichkeiten eine Menge, die sehr kurz sind, und sie sind wie @theunamedguy und @Jim-Lösungen, aber mit Timeout und Silent-Modus zusätzlich.

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

Befehle

  • eingeben Lösung

    read -rsp $'Press enter to continue...\n' 
    
  • Flucht Lösung(mit -d $ '\ e')

    read -rsp $'Press escape to continue...\n' -d $'\e' 
    
  • Jede Taste Lösung(mit -n 1)

    read -rsp $'Press any key to continue...\n' -n 1 key 
    # echo $key 
    
  • Frage mit vorgewählten Wahl(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; 
    
  • Schlaf verbessert alias

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

Erklärung

-r gibt Raw-Modus, die es erlauben, nicht kombinierten Zeichen wie "\" oder „^ ".

-s gibt stillen Modus an, und da wir keine Tastaturausgabe benötigen.

-p $ 'Prompt ' gibt die Eingabeaufforderung, die zwischen $' und' lassen Räume und Escape-Zeichen sein muß. Seien Sie vorsichtig, Sie müssen zwischen einfache Anführungszeichen mit Dollar-Symbol setzen, um entkernte Zeichen zu nutzen, ansonsten können Sie einfache Anführungszeichen verwenden.

-d $ ‚\ e gibt escappe als Trennzeichen charater, so als letztes Zeichen für aktuellen Eintrag, das möglich ist, jedes Zeichen zu setzen, aber vorsichtig sein, um ein Zeichen zu setzen, dass der Benutzer eingeben kann.

-n gibt an, dass nur ein einzelnes Zeichen benötigt wird.

-e spezifiziert den Readline-Modus.

-i $ 'Y' gibt Y als Anfang Text in Readline- Modus.

-t legt ein Timeout von 5 Sekunden

Schlüssel im Fall dienen müssen Sie den Eingang wissen, in -n1 Fall die Taste, die gedrückt wurde.

$? dienen dazu, den Exit-Code des letzten Programms zu lesen, 142 im Falle eines Timeouts, 0 korrekten Eingang. Setzen Sie $? in einer Variablen so schnell wie möglich, wenn Sie es nach Somes Befehle testen müssen, weil alle Befehle $ überschreiben würden?

+0

+1 zur Erläuterung von '-s'; 'man read' und' read --help' helfen nicht bei Ubuntu 10.04.1 LTS. Edit: 'Hilfe lesen' tat; Ist der Rest veraltet? –

+0

1+ für die große Erklärung: aber ich habe 'lesen: -i: ungültige Option' für die ex. 'read -rp $ 'Sind Sie sicher (Y/n):' -ei $ 'Y' Schlüssel;' auf #osx 'lesen -rp $ 'kill-server: Sind Sie sicher (Y/n):' -d $ 'Y' Taste; 'funktioniert stattdessen für mich. ' –

+0

Ich weiß nicht, wie es auf OSX funktioniert, aber ich habe einige Tests gemacht und' -i' funktioniert perfekt auf Ubuntu, auch ich weiß nicht, wie wenn '-d' auf OSX die gleiche Weise funktioniert. –

8

read -n1 ist nicht tragbar. Ein tragbarer Weg, um das gleiche 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 read unter Verwendung von nur einer Presse ENTER prompt weiter Sie tun könnten:

sed -n q </dev/tty 
+1

'status = none' ist auch nicht tragbar. Leiten Sie stattdessen stdout und stderr nach/dev/null um. 'read -r line

+0

@StephaneChezales danke - ich wusste das nicht. ich werde es jetzt reparieren. Danke nochmal - behoben. Sie sind übrigens ein bodenloser Brunnen wertvoller Informationen. – mikeserv

+1

Beachten Sie auch die 'settings = $ (stty -g); steinig roh; dd ...; stty "$ settings" 'um die Einstellungen zu speichern und wiederherzustellen. –

1

Wenn Sie nur eine Schleife oder ein Skript muss pausieren , und Sie drücken die Eingabetaste statt einer beliebigen Taste, dann wird read allein die Aufgabe übernehmen.

7

Dies funktionierte für mich auf mehreren Varianten von Linux, wo einige dieser anderen Lösungen nicht (einschließlich der beliebtesten hier). Ich denke, es ist auch lesbar ...

echo Press enter to continue; read dummy; 

Beachten Sie, dass eine Variable als Argument an read geliefert werden muss.

+5

Vor 8 Jahren gepostet. Im Juli 2017 war das, was ich wollte. Vielen Dank. – SDsolar

+0

diese Antwort löst mein Problem, wenn ich diese Zeile kopiere und füge und aus irgendeinem Grund habe ich mehr Zeilen angehängt, die angehängten Zeilen werden nicht ausgeführt, wie war mit DOS Pause –