Hallo, kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen? # Alle Eingaben, die zwischen # <HIER> sleep 5 # </HIER> erfolgen, dürfen beim # nun folgenden read nicht berücksichtigt werden. echo -n "Jetzt die Eingabe :" # --> hier müsste der Tastaturpuffer gelöscht werden <-- read INPUT echo $INPUT Oder läuft das auf einen C-Wrapper hinaus? :-/ Das Archiv und Google haben mich nicht weitergebracht. Vielen Dank, Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
Hallo Stephan, * Am 04.07.2001 um 12:34 Uhr schrieb Stephan Hakuli:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
echo -n "Jetzt die Eingabe :" # --> hier müsste der Tastaturpuffer gelöscht werden <-- read INPUT echo $INPUT
warum will's Du den Tastaturpuffer zuvor löschen? Verwende statt 'read INPUT' lieber ein 'read -e INPUT'. Dann wird zum Einlesen der Zeichen die Readline-Bibliothek verwendet und eine nachträgliche Änderung der Eingabe ist möglich, (Cursortasten und Backspace lassen sich benutzen) Jürgen -- Wenn man vom Feind gelobt wird, hat man irgendetwas falsch gemacht. / Registered Linux-User #130804 http://counter.li.org \ \ Linux Stammtisch Bremerhaven http://linux.hs-bremerhaven.de /
On Mit, 04 Jul 2001 at 13:09 (+0200), Juergen Schwarting wrote:
* Am 04.07.2001 um 12:34 Uhr schrieb Stephan Hakuli:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
echo -n "Jetzt die Eingabe :" # --> hier müsste der Tastaturpuffer gelöscht werden <-- read INPUT echo $INPUT
warum will's Du den Tastaturpuffer zuvor löschen?
Weil sonst alles, was der Anwender vorher auf die Tastatur gehauen hat, bereits Bestandteil der Eingabe-Variablen ist. Ich habe gerade getestet: meine Version mit der read-Schleife geht nicht, das ist eine Endlos-Schleife :-( Selbst mit einer Abfrage test -z "$inp" && break läuft sie nicht sauber, weil erstmal ein Enter erwartet wird. Vorher ist es ja keine Eingabe.
Verwende statt 'read INPUT' lieber ein 'read -e INPUT'. Dann wird zum Einlesen der Zeichen die Readline-Bibliothek verwendet und eine nachträgliche Änderung der Eingabe ist möglich, (Cursortasten und Backspace lassen sich benutzen)
Das behebt das eigentliche Problem nicht, der Unterschied ist nur, dass die vorherigen Eingaben sichtbar sind und nachträglich gelöscht werden können. Jan
On Mit, 04 Jul 2001 at 12:34 (+0200), Stephan Hakuli wrote:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
# Alle Eingaben, die zwischen # <HIER> sleep 5 # </HIER> erfolgen, dürfen beim # nun folgenden read nicht berücksichtigt werden. echo -n "Jetzt die Eingabe :" # --> hier müsste der Tastaturpuffer gelöscht werden <-- read INPUT echo $INPUT
Wie wäre es mit einer read-Schleife, die die Eingaben verwirft? ... while read inp; do done echo -n "Jetzt die Eingabe :" ... Jan
* Stephan Hakuli schrieb am 04.Jul.2001:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
Tastaturpuffer gibt es so nicht. Bedenke, daß wenn Du das Skript aufrufst auch die Eingabe umgelenkt sein kann, wie willst Du da einen Tastaturpuffer löschen, wenn Du von einer Datei liest? Das Skript weiß nicht woher die Eingabe erfolgt. Bernd -- ROTFL = Rolling On The Floor, Laughing = Auf dem Boden wälzen, lachend. SCNR = Sorry, Could Not Resist = Sorry, Ich konte nicht wiederstehen. AFAIK = As Far As I Know = So weit ich weis|BTW = By The Way = Nebenbei bemerkt IMHO = In My Humble Opinion = meiner bescheidenen Meinung nach |Zufallssig. 9
Am Mittwoch, 4. Juli 2001 15:02 tippte Bernd Brodesser:
* Stephan Hakuli schrieb am 04.Jul.2001:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
Tastaturpuffer gibt es so nicht. Bedenke, daß wenn Du das Skript aufrufst auch die Eingabe umgelenkt sein kann, wie willst Du da einen Tastaturpuffer löschen, wenn Du von einer Datei liest? Das Skript weiß nicht woher die Eingabe erfolgt.
Hi Bernd, hi Stephan, IMHO gibt es schon sowas in die Richtung. Schließlich ist es ja ein Phänomen, wenn Dir beispielsweise Windows abschmiert[1], daß Du noch 10-20 mal irgendeine Taste ausprobieren kannst, bis die Kiste, dann bei jeder Taste nur mehr *beept*. Vielleicht ist es nur nicht ansprechbar. Abgesehen davon. Könnte eventuell ein simples sync zum gewünschten Ergebnis führen? [1] Bei Linux hab ich da noch keine prägenden Erfahrungen gemacht :-) -- CU Alex Linien sind keine Striche. Du sagst ja zu einer Strecke auch nicht "Weg" ? oder doch? Tackern macht Spass! Aber Ich bin trotzdem ein Er und keine Sie. Deswegen du irren machen. [WoKo in dag°]
* Alex Klein schrieb am 04.Jul.2001:
IMHO gibt es schon sowas in die Richtung. Schließlich ist es ja ein Phänomen, wenn Dir beispielsweise Windows abschmiert[1], daß Du
Windows != Linux Bernd -- Probleme mit dem Drucker? Schon die Druckercheckliste beachtet? http://localhost/doc/sdb/de/html/drucker-howto.html | Auch lesenswert: Oder schon das Drucker-HOWTO gelesen? | man lpr file://usr/shar/doc/howto/de/DE-Drucker-HOWTO.txt.gz | Zufallssignatur 3
Am Mittwoch, 4. Juli 2001 17:19 tippte Bernd Brodesser:
* Alex Klein schrieb am 04.Jul.2001:
IMHO gibt es schon sowas in die Richtung. Schließlich ist es ja ein Phänomen, wenn Dir beispielsweise Windows abschmiert[1], daß Du
Windows != Linux
Andererseits PC = PC Mich überzeugen beide Argumente nicht. Ich denke aber, daß es unter jedem BS eine "Art Puffer" gibt. Siehe auch Jan bzgl stdin. Stephan: hilft nun sync oder nicht? Erste Mail ist anscheinend noch nicht da oder verlorengegangen. -- CU Alex Ich glaub's nicht. Ich glaub's einfach nicht. WoKo hat ein Quoting ohne Kammeffekt geschafft! Ist das nicht eine Leistung? [Christopher Splinter etwas fassungslos in dag°]
Hi Alex, On Wednesday, 4. July 2001 19:13, Alex Klein wrote: [...]
Stephan: hilft nun sync oder nicht?
Erste Mail ist anscheinend noch nicht da oder verlorengegangen.
nein, ich habe es getestet, hatte aber gestern keine Zeit mehr, darauf zu antworten. Wie Jan auch schon geschrieben hat, wirkt sync AFAIK nur auf Dateisysteme auf HD's und Co. Trotzdem danke. Gruß, Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
On Mit, 04 Jul 2001 at 16:46 (+0200), Alex Klein wrote:
Am Mittwoch, 4. Juli 2001 15:02 tippte Bernd Brodesser:
* Stephan Hakuli schrieb am 04.Jul.2001:
kennt jemand eine Möglichkeit, aus einem Shell-Skript heraus den Tastaturpuffer zu löschen?
Tastaturpuffer gibt es so nicht. Bedenke, daß wenn Du das Skript aufrufst auch die Eingabe umgelenkt sein kann, wie willst Du da einen Tastaturpuffer löschen, wenn Du von einer Datei liest? Das Skript weiß nicht woher die Eingabe erfolgt.
IMHO gibt es schon sowas in die Richtung. Schließlich ist es ja ein Phänomen, wenn Dir beispielsweise Windows abschmiert[1], daß Du noch 10-20 mal irgendeine Taste ausprobieren kannst, bis die Kiste, dann bei jeder Taste nur mehr *beept*. Vielleicht ist es nur nicht ansprechbar.
Warum in die Ferne schweifen: Ich denke, dass Stephan folgenden Effekt meinte (das ist eher der Buffer von stdin, nicht der der Tastatur): Starte folgendes Script: <schnipp> #! /bin/bash sleep 10 echo -n "Eingabe: " read inp echo $inp exit 0 <schnapp> und gib in den ersten 10 Sekunden nach dem Start willkürlich auf der Tastatur was ein. Du wirst das Ergebnis in $inp sehen. Wenn Du den hier schon genannten Tipp mit read -e anwendest, dann stehen die inzwischen eingegebenen Zeichen auch da und können wenigstens noch editiert werden. In C gibt es zu diesem Zweck die Funktion fflush (), mit der man Buffer geöffneter Dateien leeren kann - das wirkt auch mit stdin. Ich weiss nicht, ob man evtl. über stty das Verhalten von stdin beeinflussen kann - man kann die im Buffer liegenden Zeichen ja im Normalfall nicht abholen, weil sie erst mit einem Return zur Verfügung stehen.
Abgesehen davon. Könnte eventuell ein simples sync zum gewünschten Ergebnis führen?
Nein, das wirkt nur auf die Dateisysteme auf HD + Wechseldatenträger. Jan
Hallo, On Wednesday, 4. July 2001 17:56, Jan Trippler wrote: [...]
Ich denke, dass Stephan folgenden Effekt meinte (das ist eher der Buffer von stdin, nicht der der Tastatur):
Starte folgendes Script: <schnipp> #! /bin/bash
sleep 10
echo -n "Eingabe: " read inp echo $inp
exit 0 <schnapp>
und gib in den ersten 10 Sekunden nach dem Start willkürlich auf der Tastatur was ein. Du wirst das Ergebnis in $inp sehen. Wenn
genau das meine ich. Mit den mir bekannten Bordmitteln habe ich keine Lösung gefunden, daher war meine Hoffnung, dass jemand eine Idee für einen "dirty workaround" hat.
Du den hier schon genannten Tipp mit read -e anwendest, dann stehen die inzwischen eingegebenen Zeichen auch da und können wenigstens noch editiert werden.
Das "-e" steht schon drin, ich habe es der Einfachheit halber nicht mit in das hier gepostete "Skript-Gerüst" übernommen.
In C gibt es zu diesem Zweck die Funktion fflush (), mit der man Buffer geöffneter Dateien leeren kann - das wirkt auch mit stdin.
Oh, das klingt gut. Und meinen noch rudimentären C-Kenntnissen wird das auch nicht schaden. *g*
Ich weiss nicht, ob man evtl. über stty das Verhalten von stdin beeinflussen kann - man kann die im Buffer liegenden Zeichen ja im Normalfall nicht abholen, weil sie erst mit einem Return zur Verfügung stehen.
Das sehe ich genauso. Allen Antwortern vielen Dank für die investierte Zeit. Ich werde es mit der von Jan vorgeschlagenen C-Funktion versuchen. Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
Stephan Hakuli wrote:
Hallo,
On Wednesday, 4. July 2001 17:56, Jan Trippler wrote: [...]
Ich denke, dass Stephan folgenden Effekt meinte (das ist eher der Buffer von stdin, nicht der der Tastatur):
Starte folgendes Script: <schnipp> #! /bin/bash
sleep 10
echo -n "Eingabe: " read inp echo $inp
exit 0 <schnapp>
und gib in den ersten 10 Sekunden nach dem Start willkürlich auf der Tastatur was ein. Du wirst das Ergebnis in $inp sehen. Wenn
genau das meine ich. Mit den mir bekannten Bordmitteln habe ich keine Lösung gefunden, daher war meine Hoffnung, dass jemand eine Idee für einen "dirty workaround" hat.
Du den hier schon genannten Tipp mit read -e anwendest, dann stehen die inzwischen eingegebenen Zeichen auch da und können wenigstens noch editiert werden.
Das "-e" steht schon drin, ich habe es der Einfachheit halber nicht mit in das hier gepostete "Skript-Gerüst" übernommen.
In C gibt es zu diesem Zweck die Funktion fflush (), mit der man Buffer geöffneter Dateien leeren kann - das wirkt auch mit stdin.
Oh, das klingt gut. Und meinen noch rudimentären C-Kenntnissen wird das auch nicht schaden. *g*
Ich weiss nicht, ob man evtl. über stty das Verhalten von stdin beeinflussen kann - man kann die im Buffer liegenden Zeichen ja im Normalfall nicht abholen, weil sie erst mit einem Return zur Verfügung stehen.
Ja, das geht ;) Versuch mal: --------8<----------- #!/bin/bash timeout=30 t=0 inp=""; stty -icanon min 0 time 1 cbreak while [ "X$inp" = X -a $t -le $timeout ]; do read inp; [ $inp ] && echo -ne "\bYou pressed $inp"; ## fuer Jan =8-) t=$(( $t + 1 )) done if [ $t -ge $timeout ] ; then echo "Session timeout." fi stty sane ## nicht vergessen!! -----------8<--------- Wenn man damit eine while true Schleife baut, hat man einen huebschen idle-time Killer ;) man stty ...haette ich gerne geschrieben... leider ist es aber info stty ;)) Wer perl lieber hat.. Bitte: -----8<---------- #! /usr/bin/perl system("/bin/stty cbreak < /dev/tty"); open(IN, "< /dev/tty"); $keypressed=getc(IN); close IN; system("/bin/stty cbreak < /dev/tty"); print $keypressed -----8<---------- Ging vor 3 Jahren hier durch die Liste (es lebe mein Archiv! ;) so long... bernd
On Wednesday, 4. July 2001 22:44, Bernd Obermayr wrote:
On Wednesday, 4. July 2001 17:56, Jan Trippler wrote:
Ich weiss nicht, ob man evtl. über stty das Verhalten von stdin beeinflussen kann - man kann die im Buffer liegenden Zeichen ja im Normalfall nicht abholen, weil sie erst mit einem Return zur Verfügung stehen.
Ja, das geht ;)
Versuch mal: [Hochinteressanter Vorschlag]
Vielen Dank, Bernd! :-) Ich sehe, dass ich mich nochmal mit stty beschäftigen muss, da ich Deinen Vorschlag nicht nur abpinnen, sondern verstehen will. Vielleicht komme ich ja diesmal noch drumherum, die C-Bücher auskramen zu müssen... *g* Gruß, Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
On Wednesday, 4. July 2001 22:44, Bernd Obermayr wrote: [...]
Versuch mal:
--------8<----------- #!/bin/bash timeout=30 t=0 inp="";
stty -icanon min 0 time 1 cbreak
while [ "X$inp" = X -a $t -le $timeout ]; do read inp; [ $inp ] && echo -ne "\bYou pressed $inp"; ## fuer Jan =8-) t=$(( $t + 1 )) done
if [ $t -ge $timeout ] ; then echo "Session timeout." fi
stty sane ## nicht vergessen!! -----------8<---------
Hm, möglicherweise hast Du mich falsch verstanden. Die while-Schleife oben wartet auf eine Eingabe und reagiert sofort, wenn $inp einen Wert bekommt. Mir ging es aber darum, alle Eingaben, die vor Beginn des Eingabeteils (hier die while-Schleife) getätigt wurden, zu löschen, damit diese nicht gleich zur erwarteten Eingabe werden. Und das würde auch bei Deinem Vorschlag passieren. Trotzdem ist das eine elegante Methode, ich habe gleiche Funktionalität mit einem read-timeout "-t 1" gelöst. Das hier ist schöner. :-) Gruß, Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
Stephan Hakuli wrote:
On Wednesday, 4. July 2001 22:44, Bernd Obermayr wrote: [...]
Versuch mal:
--------8<----------- #!/bin/bash timeout=30 t=0 inp="";
stty -icanon min 0 time 1 cbreak
while [ "X$inp" = X -a $t -le $timeout ]; do read inp; [ $inp ] && echo -ne "\bYou pressed $inp"; ## fuer Jan =8-) t=$(( $t + 1 )) done
if [ $t -ge $timeout ] ; then echo "Session timeout." fi
stty sane ## nicht vergessen!! -----------8<---------
Hm, möglicherweise hast Du mich falsch verstanden. Die while-Schleife oben wartet auf eine Eingabe und reagiert sofort, wenn $inp einen Wert bekommt.
Mir ging es aber darum, alle Eingaben, die vor Beginn des Eingabeteils (hier die while-Schleife) getätigt wurden, zu löschen, damit diese nicht gleich zur erwarteten Eingabe werden. Und das würde auch bei Deinem Vorschlag passieren. Trotzdem ist das eine elegante Methode, ich habe gleiche Funktionalität mit einem read-timeout "-t 1" gelöst. Das hier ist schöner. :-)
Ne, das hab ich schon verstanden, es wurde aber in einer anderen Mail schon mal erwaehnt, wie man einen flush machen koennte. Also -------8<--------- #!/bin/bash ## Ein simples Menue ## CopyLeft: Traditional from the last century ;) ############################################################# ## Puffer leeren stty -icanon min 0 time 1 cbreak read inp; timeout=10 inp=""; ## Menue anzeigen und Auswahl ausfuehren. while true ; do clear echo " $msg Bitte waehlen: w) Wer ist angemeldet. d) Datum. e) Ende. " echo -n "Ihre Eingabe bitte: " stty -icanon min 0 time 1 cbreak t=1 while [ $t -le $timeout ]; do read inp; if [ $inp ] ; then clear break 1 fi sleep 1 t=$(( $t + 1 )) done stty sane ## nicht vergessen!! if [ $t -ge $timeout ] ; then echo -e "\n\n\t\t\tSession timeout." exit fi echo "Ihre Auswahl: $inp"; case $inp in w|W ) who echo -n "Bitte Return druecken." read dummy ;; d|D ) date echo -n "Bitte Return druecken." read dummy ;; e|E ) echo "Have a nice day." exit ;; * ) msg="Das war nix. Bitte waehlen Sie aus w,d,e" ;; esac done exit -------8<--------- Theoretisch gehts so ;) so long... bernd
On Thursday, 5. July 2001 18:03, Bernd Obermayr wrote:
Stephan Hakuli wrote: [...]
Hm, möglicherweise hast Du mich falsch verstanden. Die while-Schleife oben wartet auf eine Eingabe und reagiert sofort, wenn $inp einen Wert bekommt. [...] Ne, das hab ich schon verstanden, es wurde aber in einer anderen Mail schon mal erwaehnt, wie man einen flush machen koennte.
Also
-------8<--------- #!/bin/bash ## Ein simples Menue ## CopyLeft: Traditional from the last century ;) #############################################################
## Puffer leeren stty -icanon min 0 time 1 cbreak read inp;
timeout=10
inp="";
Das wars. Vor Menübeginn noch ein read und inp="". Ich hatte beim Testen Deines ersten Skripts einfach ein sleep 5 vorangestellt. Klar, die Eingaben während dieser Sleep-Phase werden dann beim ersten "You pressed... " berücksichtigt, wenn sie nicht vorher wie oben "abgefangen" werden. [...]
Theoretisch gehts so ;)
Praktisch auch. Vielen Dank, Du hast mir sehr geholfen! :-) Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
Hi Stephan,
On 2001-07-04 16:52 GMT, Stephan Hakuli
On Wednesday, 4. July 2001 17:56, Jan Trippler wrote:
In C gibt es zu diesem Zweck die Funktion fflush (), mit der man Buffer geöffneter Dateien leeren kann - das wirkt auch mit stdin.
Oh, das klingt gut. Und meinen noch rudimentären C-Kenntnissen wird das auch nicht schaden. *g*
Es wurd Deinem Script aber auch nichts nützen ;-)
Wenn Du jetzt ein C-Programm schreibst, das (fast) nur fflush(stdin)
enthält, leert das nur den eigenen stdin (den des C-Programms). Stdin
des Scripts wird nicht angefaßt.
--
Ralf Cirksena
Hallo, On Thursday, 5. July 2001 09:42, Ralf Cirksena wrote:
On 2001-07-04 16:52 GMT, Stephan Hakuli
wrote: On Wednesday, 4. July 2001 17:56, Jan Trippler wrote:
In C gibt es zu diesem Zweck die Funktion fflush (), mit der man Buffer geöffneter Dateien leeren kann - das wirkt auch mit stdin.
Oh, das klingt gut. Und meinen noch rudimentären C-Kenntnissen wird das auch nicht schaden. *g*
Es wurd Deinem Script aber auch nichts nützen ;-) Wenn Du jetzt ein C-Programm schreibst, das (fast) nur fflush(stdin) enthält, leert das nur den eigenen stdin (den des C-Programms). Stdin des Scripts wird nicht angefaßt.
da hast Du natürlich recht. Nein, wenn ich mich für C entscheide, dann wird schon das ganze Skript ge`C`t. Gruß, Stephan -- Stephan Hakuli | mailto: stephan@hakuli.de | * GnuPG/PGP-Key * | callto: 01 71 - 651 89 43 | available, please | surfto: http://www.hakuli.de | visit my homepage
participants (7)
-
Alex Klein
-
B.Brodesser@t-online.de
-
Bernd Obermayr
-
ci@holmco.de
-
Jan.Trippler@t-online.de
-
Juergen Schwarting
-
Stephan Hakuli