Currently as a workaround I read all the chars from stdin with
import std.file;
auto s = cast (string) read("/dev/fd/0");
after I found that you can't read from stdin. This is of course
non-portable Linux only code. In perl I frequently use the idiom
$s = join ('', <>);
that corresponds to D's
import std.stdio;
import std.array;
import std.typecons;
auto s = stdin.byLineCopy(Yes.keepTerminator).join;
which alas needs an amazing amount of import boilerplate. BTW why
does
byLine not suffice in this case? Then there is a third way of
reading
all the characters from stdin:
import std.stdio;
import std.array;
auto s = cast (string) stdin.byChunk(1).join;
This version behaves correctly if Ctrl+D is pressed anywhere after
the program is started. This is no longer the case a if larger
chunk
is read, e.g.:
auto s = cast (string) stdin.byChunk(4).join;
As strace reveals the resulting program sometimes reads twice zero
characters before it terminates:
read(0, a <-- A, return
"a\n", 1024) = 2
read(0, "", 1024) = 0 <-- ctrl+d
read(0, "", 1024) = 0 <-- ctrl+d
Any comments or ideas?