I've been dinking around with es, which is pretty neat, but didn't have my bash standbys (CTRL-R incremental search, ! history manipulation). Well, turns out that all my beloved bashisms are actually Gnu Readline-isms. Here's a joke shell that handles control characters, reverse search, history expansion, etc.:
// gcc jokesh.c -o jokesh -l readline
#include <stdio.h>
extern char *readline(char *);
extern void add_history(char *);
int main (int argc, char **argv) {
char *r, *s;
while (1) {
r = readline("> ");
history_expand(r, &s);
if (s && *s) {
add_history(s);
system(s); // yeah, yeah, i'm using sh for | and pathing
}
if (r && free(r))
r = (char *) NULL;
if (s && free(s))
s = (char *) NULL;
}
exit(0);
}
That's it. So, it turned out to be really trivial to add the "bash" features I wanted to es.