Here is my version:
#!/bin/bash
printf "REPL for %s\n" "$@"
notblank()
{
[ $# -gt 0 ]
}
while true ; do
printf "%s> " "$@"
read -r || break;
notblank $REPLY || continue;
eval command \"\$@\" "$REPLY"
done
We keep the original parameters and expand them with "$@". There is a Bash feature that read with no args reads the line into the REPLY variable. We want that to be subject to splitting.If $REPLY expands to nothing, including multiple whitespace, then we just want to print the prompt again: not quit and not run the command with no additional arguments.
The eval trick allows $REPLY to undergo expansion and splitting, so that shell syntax can freely be used in the REPL.
Test:
$ ~/test/replify/replify.sh git
REPL for git
git> rev-parse HEAD
7ac594319e417266764a6bc041b74807f2fe13bd
git> branch -r
origin/HEAD -> origin/master
origin/master
origin/origin/master
git> checkout "$TERM $TERM"
error: pathspec 'xterm xterm' did not match any file(s) known to git.
git> checkout $TERM
error: pathspec 'xterm' did not match any file(s) known to git.
Cute, but not terribly useful without history recall and related features. This wants to be a feature of Bash. The regular Bash repl should have a prefix variable so it can appear to be in a sub-mode for a particular command.Submit a patch for Bash to do this, and maybe you have something. Bash has a hook feature for command execution, IIRC, so this may be somehow doable without modifying Bash.
https://github.com/hanslub42/rlwrap
EDIT: beat to the punch, should've refreshed.