Ich versuche, read
Built in bash
zu verwenden, um ein Zeichen zu einer Zeit zu lesen. Das funktioniert tatsächlich einwandfrei, wenn ich das -N 1
Argument zu read
verwende, aber ich hatte einige OSX Benutzer berichten mir, dass ihre Bash diese Option nicht hat.Bash lesen Mysterium: `Read -d '' -s -n 1 'isst Bindestriche
So, jetzt bin ich mit etwas entlang der Linien von:
$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < filename
dieses jedes Zeichen in filename
einer nach dem anderen das Echo zurück außer, geheimnisvoll, Bindestriche (-
). Z.B. wenn ich
$ cat blah
uh-oh
Das Ergebnis haben, ist:
$ while IFS= read -r -d'' -s -n 1 char; do echo -n "${char}"; done < blah
uhoh
Nichts in der Dokumentation sagt alles, was dies bedeuten würde. Wenn ich ${char}
in echo
durch ${#char}
ersetze, druckt es 0
, wo es den Bindestrich hätte lesen sollen. Es wird einfach komplett gegessen.
Wenn ich die -d''
fallen sie isst stattdessen neue Zeilen, aber tut nicht Bindestrich essen, so dass zumindest sinnvoll ist, da Newline die Standardtrennzeichen ist. Es scheint fast wie ein Fehler, behandelt Bindestrich als Trennzeichen.
FWIW Ich habe
$ bash --version
GNU bash, version 4.3.42(4)-release (x86_64-unknown-cygwin)
aber dies wurde zuerst von einem OSX Benutzer bei mir gemeldet.
Verwenden 'printf% s "$ char"' statt (Nicht-Standard) 'echo -n "char $"' ... – anishsane
Ist mit 'printf 'wirklich portabler als' echo -n'? – Iguananaut
Ja. POSIX 'echo' spezifiziert keinen Standard für '-n'. – anishsane