显示或重定向shell的作业控制消息

ŹV *_*V - 5 linux shell signals zsh

TL; DR

所有作业控制/崩溃消息在函数内发生时都会被隐藏.我将在下面详细介绍,但是@Barmar已经指出可以通过在函数内部运行崩溃二进制来重现此问题,例如:

crun() { 
  /tmp/faulty $1 $2 $3
}
Run Code Online (Sandbox Code Playgroud)

我已经定义了一个函数.zshrc来编译和运行源代码,使用下面的函数:

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 "$@"
}
Run Code Online (Sandbox Code Playgroud)

可以这种方式调用:

% crun source.cc arg_1 arg_2
Run Code Online (Sandbox Code Playgroud)

这适用于普通程序,但是存在shell的作业控制消息(例如从段错误生成的消息)不会出现的问题.

举个例子:

% echo 'int main=0;' >> /tmp/faulty.c # a crashing c program
% crun faulty.c
% # no output generated
Run Code Online (Sandbox Code Playgroud)

而等效的交互式命令会产生这样的:

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

有没有办法为崩溃的可执行文件显示这些消息,其路径是动态计算的?理想情况下,无需编写自己的陷阱/信号处理程序+ exec,sh -c "$exepath $@"完全使用或编写全新的system(3)包装器

Ada*_*ian 1

zsh如果您将作业作为后台作业启动,然后立即将其带到前台,则可以从作业中打印分段错误消息。

\n\n
"$exepath" "$@" &\nfg\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将导致zsh打印出为 启动的作业的信号消息$exepath

\n\n

缺点是你得到的会比你讨价还价的多一点:

\n\n
% crun faulty.c\nfaulty.c:1:5: warning: \xe2\x80\x98main\xe2\x80\x99 is usually a function [-Wmain]\n int main=0;\n     ^~~~\n[2] 2080\n[2]  - running    "$exepath" "$@"\nzsh: segmentation fault (core dumped)  "$exepath" "$@"\n
Run Code Online (Sandbox Code Playgroud)\n\n

但如图所示,您将在终端中打印段错误消息。

\n\n

stdout由于消息是由交互式 shell 打印的,而不是由失败的进程打印的,因此如果您尝试重定向或 则作业消息将不会被重定向stderr

\n\n

因此,一方面,如果您尝试从正在运行的进程中获取有用的输出并将其重定向到其他地方,则无需担心作业消息会妨碍。但这也意味着如果您尝试通过重定向来重定向它,您将不会收到段错误消息stderr

\n\n

下面是这种效果的演示,为了清楚起见,在命令之间添加了换行符:

\n\n
% crun good.c > test\n[2] 2071\n[2]  - running    "$exepath" "$@"\n\n% cat test\nHello, world!\n\n% crun faulty.c 2>test\n[2] 2092\n[2]  - running    "$exepath" "$@"\nzsh: segmentation fault (core dumped)  "$exepath" "$@"\n\n% cat test\nfaulty.c:1:5: warning: \xe2\x80\x98main\xe2\x80\x99 is usually a function [-Wmain]\n int main=0;\n     ^~~~\n
Run Code Online (Sandbox Code Playgroud)\n\n

有关详细信息,请参阅zsh有关作业和信号的文档。您还可以浏览神奇发生的 C 文件

\n