I have a golang program that makes a simple repl for jq. I'd like to be able to read input from stdin at program start into a temporary file, so I can use the repl with piped input.
cat file.json | jqrepl
However, when I read from stdin, either using a scanner or a reader, I reach the EOF for stdin, and then I can no longer accept input from stdin for the main repl loop. Readline fails immediately because it's at EOF.
I've tried deferring a Reader.UnreadByte, Closing the scanner, and a multitude of "seek(0)", and other raw operations on stdin.
Is there a way to reset the stdin so that it can be read from again? Ideally I would read until EOF, save that to a temporary file, and then enter the repl mode.
Thanks!
(I suppose the stdin you mentioned as in "I can no longer accept input from stdin for the main repl loop" is referring to the interactive user input.)
Try like this:
[STEP 101] # cat foo.sh
while read line; do
printf '> %s\n' "$line"
done
# close stdin
exec 0<&-
# reopen stdin to /dev/tty
exec 0< /dev/tty
read -p 'Input something: ' v
printf 'You inputted: %s\n' "$v"
[STEP 102] # printf '%s\n' foo bar | bash ./foo.sh
> foo
> bar
Input something: hello world
You inputted: hello world
[STEP 103] #