Displaying or redirecting a shell's job control messages

Viewed 467

TL;DR

All job control / crash messages are hidden when they occur within a function. I go into more detail below, but @Barmar has pointed out that this issue can be reproduced by running a crashing binary inside of a function, e.g:

crun() { 
  /tmp/faulty $1 $2 $3
}

I've defined a function in my .zshrc to compile & run source code with the function below:

crun() {
    local file=$1
    shift
    local exepath="$(mktemp)"

    if [[ $file =~ "\.c$" ]]; then
        gcc -g -Wall $file -o $exepath || return $?
    else
        echo "no filetype detected"
        return 126
    fi

    $exepath "$@"
}

Which can be called in this fashion:

% crun source.cc arg_1 arg_2

This works for normal programs, but has the problem that the shell's job control messages, such as those generated from a segfault, do not appear.

As an example:

% echo 'int main=0;' >> /tmp/faulty.c # a crashing c program
% crun faulty.c
% # no output generated

Whereas the equivalent interactive commands would generate this:

% g++ faulty.c -o /tmp/faulty && /tmp/faulty
[1] 2894 segmentation fault (core dumped) #  zsh's job control output for SIGSEGV

Is there any way to display these messages for a crashing executable whose path is dynamically calculated? Ideally without writing your own trap/signal handlers + exec, using sh -c "$exepath $@", or writing a totally new system(3) wrapper entirely)

1 Answers
Related