Show HN: Replify – Create a REPL for any command
gist.github.com
gist.github.com
#!/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.
EDIT: beat to the punch, should've refreshed.
to do so however didn't just require a similar number of lines, it actually required 4 more (though to be fair, both scripts have comments and a fair bit of formatting, so it may not be a fair comparison. also it probably doesn't need stating, but i'm a bit of a hack, so my implementation maybe shouldn't be the reference point. but i digress)
in any event, i don't think atwood's law comes into play, given that a) this isn't in javascript and b) defunkt is a well known member of the ruby community who spends a lot of time working in ruby and probably wrote this to actually use it, as quickly as he could think of it. his choice of language here is perfectly reasonable in that context.
if you remain convinced that the only correct language for such a tool is bash/shell, i imagine OP certainly welcomes PRs; i know i do.
afaik, it will work just about anywhere you can invoke a shell (i haven't tested it all that extensively)