After discussing it with jca@ and trying a few variations I've settled on the attached diff.
We indicate if sh(1) was signalled because we have that information at hand. Otherwise we report the exit status as we always have. ok? Index: grep.c =================================================================== RCS file: /cvs/src/usr.bin/mg/grep.c,v retrieving revision 1.45 diff -u -p -r1.45 grep.c --- grep.c 12 Oct 2017 14:12:00 -0000 1.45 +++ grep.c 9 Jan 2018 15:23:35 -0000 @@ -4,6 +4,8 @@ #include <sys/queue.h> #include <sys/types.h> +#include <sys/wait.h> + #include <ctype.h> #include <libgen.h> #include <limits.h> @@ -180,7 +182,7 @@ compile_mode(const char *name, const cha char *buf; size_t sz; ssize_t len; - int ret, n; + int ret, n, status; char cwd[NFILEN], qcmd[NFILEN]; char timestr[NTIME]; time_t t; @@ -226,11 +228,16 @@ compile_mode(const char *name, const cha t = time(NULL); strftime(timestr, sizeof(timestr), "%a %b %e %T %Y", localtime(&t)); addline(bp, ""); - if (ret != 0) - addlinef(bp, "Command exited abnormally with code %d" - " at %s", ret, timestr); - else - addlinef(bp, "Command finished at %s", timestr); + if (WIFEXITED(ret)) { + status = WEXITSTATUS(ret); + if (status == 0) + addlinef(bp, "Command finished at %s", timestr); + else + addlinef(bp, "Command exited abnormally with code %d " + "at %s", status, timestr); + } else + addlinef(bp, "Subshell killed by signal %d at %s", + WTERMSIG(ret), timestr); bp->b_dotp = bfirstlp(bp); bp->b_modes[0] = name_mode("fundamental");