read with history
To copy Mike Stroyan's great answer from this old mailing list post:
You can use "history -r" to read a file into the shell's history and "history -s" to add each line that you read into the history. Then use history -w to save the history back to the file. Here is an example with vi style readline editing.
#!/bin/bash
history -r script_history
set -o vi
CMD=""
while true
do
echo "Type something"
read -e CMD
history -s "$CMD"
echo "You typed $CMD"
case "$CMD" in
stop)
break
;;
history)
history
;;
esac
done
history -w script_history
echo stopping
You can use rlwrap
for this, if you don't mind installing software.
You'll probably want to keep a separate history file that only maintains history for the particular prompt in your script (ie. avoid mixing with the user's shell command history).
Here's an example that might work for you:
#!/bin/sh
# Save in rlwrap_example.sh
HISTORY=$HOME/.myscript_history
USERINPUT=$(rlwrap -H $HISTORY sh -c 'read REPLY && echo $REPLY')
echo "User said $USERINPUT"
$ ./rlwrap_example.sh
hello
User said hello
In the above script, the user can use all GNU readline functionality, with history served from — and stored in — ~/.myscript_history
. Tweak as needed.
Alternatively, you can use bash's read -e
, which enables readline for read
invocations, but you will probably find its history functionality too limited (ie. almost nonexistent).