Manchmal cat
mag ich einen Stream /dev/input/event0
.
Ich möchte ein Skript schreiben, das jedes Mal etwas tut, wenn mehr ausgegeben wird.
Die Definition von mehr Ausgabe kann jedes Mal sein, wenn ein Byte gelesen wird.
Wie kann das gemacht werden? Gibt es einen Befehl, der das macht?
read -N5
, bash kann fünf (möglicherweise Multibyte-) Zeichen mit lesenread -rN5
, zsh kann 5 (möglicherweise Multibyte-) Zeichen mit lesenread -u0 -k5
. Sowohl bash als auch zsh können mithilfe des C-Gebietsschemas (oder wahrscheinlich eines beliebigen 8-Bit-Zeichen-Typs) Bytes anstelle von Zeichen lesen.read -N
ist neu in Bash 4.2, so dass es möglicherweise nicht überall ist. Außerdem scheint BashLC_CTYPE=C IFS= read -rN 1
bestimmte Bytes zu essen (0x00, 0xff). ksh scheint 0x00 zu essen (wahrscheinlich aufgrund der internen Verwendung von NUL-terminierten Strings). zsh scheint aber richtig zu funktionieren.Eine Variation der Antwort von Geekosaurier:
Vielleicht möchten Sie versuchen
read -n 1 byte
, jeweils ein Byte zu lesen und dann etwas damit zu tun$byte
.BEARBEITEN:
Ich habe es gerade versucht, da ich diesen Befehl noch nie zuvor verwendet hatte (habe nur nachgeschlagen
info bash
), aber es scheint alle Leerzeichen und Zeilenenden zu verschlingen. Ich habe noch keine Erklärung dafür.Versuchen Sie die folgenden Skripte, um die Befehlsargumente zu optimieren:
Dies ergibt leider nicht das erwartete Ergebnis.
EDIT (mit Chris 'Hilfe):
Dies ergibt genau das erwartete Ergebnis.
Hinweis: ob ich
-n
,-N
oder-rN
das Ergebnis nicht ändern, es ist alles gut (mit Text, ich habe nicht testen Sie die Einschränkung , dass Chris spricht über: 0x00 und 0xFF).quelle
echo $foo
,$foo
werden alle Leerzeichen (alle Zeichen in$IFS
, um pedantisch zu sein) zu einzelnen Leerzeichen komprimiert, währendecho "$foo"
sie beibehalten werden. Sie müssen es jedoch konsequent verwenden , um sicherzustellen, dass das Leerzeichen immer in Anführungszeichen steht.read -n
(undread -N
in 4.2) zu ignorieren scheint . Die Problemumgehung ist zu verwendenIFS= read -rn 1
(selbst dann isst bash immer noch 0x00 und 0xff).bash
; es scheint immer solche dummen Fehler zu haben. (Mein "Lieblings"bash
-Fehler war in einer 2.x-Version, in der Backslashes für den Fall, dass Muster nicht aufhören*
, ein Glob-Match zu sein.)