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

2023-12-05

TL;DR

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

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

我在我的中定义了一个函数.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 "$@"
}

可以用这种方式调用:

% crun source.cc arg_1 arg_2

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

举个例子:

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

而等效的交互式命令将生成以下内容:

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

对于路径是动态计算的崩溃可执行文件,是否有任何方法可以显示这些消息?理想情况下无需编写自己的陷阱/信号处理程序 +exec, using sh -c "$exepath $@",或者写一个全新的system(3)完全包装)


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

"$exepath" "$@" &
fg

这会导致zsh打印出有关开始的作业的信号消息$exepath.

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

% crun faulty.c
faulty.c:1:5: warning: ‘main’ is usually a function [-Wmain]
 int main=0;
     ^~~~
[2] 2080
[2]  - running    "$exepath" "$@"
zsh: segmentation fault (core dumped)  "$exepath" "$@"

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

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

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

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

% crun good.c > test
[2] 2071
[2]  - running    "$exepath" "$@"

% cat test
Hello, world!

% crun faulty.c 2>test
[2] 2092
[2]  - running    "$exepath" "$@"
zsh: segmentation fault (core dumped)  "$exepath" "$@"

% cat test
faulty.c:1:5: warning: ‘main’ is usually a function [-Wmain]
 int main=0;
     ^~~~

有关更多信息,请参阅zsh有关作业和信号的文档。你也可以去逛逛神奇发生的 C 文件.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示或重定向 shell 的作业控制消息 的相关文章

  • 如何使用 exec.Command 在 golang 中执行 Mysql 脚本

    您好 我正在尝试执行一个脚本以使用 Golang 将数据填充到数据库中 func executeTestScript cmd exec Command usr local mysql bin mysql h127 0 0 1 P3333 u
  • 如何将文件中的行读入数组?

    我正在尝试将文件作为行数组读入 然后使用 zsh 对其进行迭代 我得到的代码在大多数情况下都有效 除非输入文件包含某些字符 例如括号 这是它的一个片段 bin zsh LIST cat path to some file txt SIZE
  • 如何清理 Runtime.exec() 中使用的用户输入?

    我需要通过命令行调用自定义脚本 这些脚本需要很少的参数并在 Linux 机器上调用 当前版本容易出现各种shell注入 如何清理用户给出的参数 参数包括登录名和路径 Unix 或 Windows 路径 用户应该能够输入任何可能的路径 该路径
  • PyQt 中的线程和信号问题

    我在 PyQt 中的线程之间进行通信时遇到一些问题 我使用信号在两个线程 发送者和监听者 之间进行通信 发送者发送消息 期望被监听者接收 但是 没有收到任何消息 谁能建议可能出了什么问题 我确信这一定很简单 但我已经环顾了几个小时但没有发现
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • 有没有办法让 Linux CLI IO 重定向持久化?

    我有多个管道命令 如下所示 find options grep options xargs grep options 它们中的每一个都可能产生我不感兴趣的错误 权限错误 文件名空格错误等 因此 我想将所有错误重定向到 dev null 我知
  • ubuntu 中的 echo -e 选项不起作用

    我的同事使用Ubuntu 我使用openSUSE 我们使用相同的makefile编译相同的源代码 我的环境运行良好 但我的同事不能 总是输出无法识别 e选项 我们检查makefile 只发现echo命令使用 e option Ubuntu的
  • 如何更改 Kubernetes 中的文件系统观察程序限制 (fs.inotify.max_user_watches)

    我在用着pm2 https github com Unitech pm2查看保存我的应用程序服务器的 NodeJS 程序源代码的目录 该程序在 Kubernetes 集群中运行 但是 我收到此错误 ENOSPC System limit f
  • /usr/bin/as:无法识别的选项“-EL”

    因此 在为我的1plus手机编译android内核时 经过3天的多次尝试 我放弃了并尝试在这里询问是否有人以前遇到过这个问题 这个错误对我来说有点模糊 但我觉得问题来自于我最近对 GNU Linux 发行版 Gentoo 的更改 它在不应该
  • 从 shell 脚本导入函数

    我有一个 shell 脚本 我想用 shUnit 测试它 该脚本 以及所有函数 位于单个文件中 因为它使安装更加容易 示例script sh bin sh foo bar code 我想编写第二个文件 不需要分发和安装 来测试中定义的函数s
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • 有没有办法改变vim的默认模式

    有谁知道如何更改vim的默认模式 它的默认模式是命令模式 但是我可以将其更改为插入模式吗 只需将以下行添加到您的 vimrc 中 start Vim s default mode will be changed to Insert mode
  • 在 shell 脚本中将脚本目录更改为用户的 homedir

    在我的 bash 脚本中 我需要将当前目录更改为用户的主目录 如果我想更改为用户的foo主目录 从命令行我可以执行以下操作 cd foo 效果很好 但是当我从script它告诉我 bar sh line 4 cd foo No such f
  • 检查 Linux 中给定进程的打开 FD 限制

    我最近有一个 Linux 进程 泄露 了文件描述符 它打开了文件描述符 但没有正确关闭其中一些文件描述符 如果我对此进行监控 我就可以提前得知该过程已达到其极限 有没有一种很好的 Bash 或 Python 方法来检查 Ubuntu Lin
  • 警告构建使用导出符号的内核模块

    我有两个内核模块 例如 modA 和 modB modA 导出一个符号EXPORT SYMBOL symA modB 使用它 我有标题modA h对于modA extern void symA int param and in modB c
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • 如何从powershell获取主机名?

    我如何获得hostname https stackoverflow com q 42014215 262852 for dur来自 powershell PS home thufir powershell gt PS home thufir
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • Bash:替换管道标准输入中的子字符串

    我尝试用新的子字符串替换标准输入中的某个子字符串 在读取几个文件后 我必须从管道获取标准输入cat 然后我想将更改后的字符串向前推到管道中 这是我尝试做的 cat file1 file2 echo cat path to file path

随机推荐

  • Jquery 移动后退按钮

    我有一个应用程序 在其中以编程方式向页面添加后退按钮 这意味着第一页上不会有后退按钮 然而 应用程序本身有多种进入应用程序的方式 换句话说 我可以收到通知 并且在触摸该通知时 它会转到应用程序中的特定区域 该区域不会有返回主页的后退按钮 如
  • 动态改变UITable单元格高度?

    我需要根据内容大小 长度调整单元格高度 尝试了几种方法 哪一种给出了准确的高度而不重叠 请参阅本教程进行更改UITableViewCell动态高度 调整 A UITableViewCell 大小 并使用本教程 uitableviewcell
  • 在keras中对合并层进行训练

    我正在实施以下this穆罕默德 哈瓦伊 Mohammad Havaei 的论文 它使用以下架构 我修改了一些代码here这样做 print Compiling two path model local pathway modle l Seq
  • 使用FJCore编码Silverlight WriteableBitmap

    我试图找出如何使用 FJCore 将 WriteableBitmap 编码为 jpeg 我知道 WriteableBitmap 提供原始像素 但我不确定如何将其转换为 FJCore 为其 JpegEncoder 方法期望的格式 JpegEn
  • 页脚位于页面底部或内容底部(以较低者为准)

    我有以下结构 div div
  • 在 javascript 中使用 webkit-playsinline

    如何在 javascript 中而不是 html5 视频标签中使用 webkit playsinline 我想像在 javascript 中使用视频标签控制 自动播放属性一样使用它 或者你们有其他有效的方法吗 我正在开发一个用于传输视频的
  • 即使手机处于锁定模式,活动也会显示

    我的问题与此类似如何让 Android 设备启动并跳过屏幕锁定 我想从广播接收器显示一个对话框 但 Android API 不允许我这样做 因此我正在使用从那里启动一个活动并将该活动的主题更改为 Theme 现在 即使手机处于锁定模式 睡眠
  • 当我的主选择使用 AJAX 更改时,如何刷新详细选择列表

    我正在寻找一些指示 我有一个包含主题列表的选择列表
  • Haskell:如何将多个实例放在同一个模块中?

    假设我有以下代码 import Data List Ordered data Person Person String String deriving Show Eq main IO main print show sort Person
  • CSS 伪类与 jQuery

    我刚刚学了一点 jQuery 并尝试用它来实现简单的变色效果 假设我有两个 div s foo 和 bar foo 有很多 URL 并且定义了以下 CSS foo a color blue border bottom 1px dashed
  • 使用 PDO 发送空值会导致错误

    我们有类似以下 PDO 语句 用于与 PostgreSQL 8 4 DB 进行通信 st db gt prepare INSERT INTO Saba Betriebskosten personalkosten VALUES kd pers
  • 捆绑已关闭,但我仍然想要版本控制

    我在 MVC4 中使用捆绑 或者更确切地说我was使用捆绑但不得不将其关闭 这意味着脚本和样式链接仅呈现在单独的行上 并且没有版本字符串以确保浏览器在有更新时下载最新文件 我尝试在捆绑代码中添加版本字符串 但随后收到一条错误消息 指出路径无
  • 如何在 Swift 中检查 Documents 目录中是否存在文件?

    如何检查文件是否存在于Documents目录中Swift 我在用 writeFilePath 方法将图像保存到文档目录中 我想在每次启动应用程序时加载它 但如果没有保存的图像 我有一个默认图像 但我就是不知道如何使用 func fileEx
  • 在单个数组对象上重写 toString() Javascript

    我有以下内容 var version 0 3 0 Override the version toString method version proto toString function return this join 哪个执行以下操作
  • Ruby on Rails:在哪里定义全局常量?

    我刚刚开始使用我的第一个 Ruby on Rails Web 应用程序 我有很多不同的模型 视图 控制器等等 我想找到一个好地方来保存真正全局常量的定义 这些常量适用于我的整个应用程序 特别是 它们既适用于我的模型的逻辑 也适用于我的观点所
  • Android:如何在双卡手机中使用特定 SIM 卡发送短信?

    我找到了一些code这样做 但它给了我一个异常 尝试在空对象引用上调用虚拟方法 java lang Class java lang Object getClass 我正在使用我的 Moto G 第三代进行测试 以下是代码 如果我遗漏了任何内
  • Prolog:将数字拆分为递增整数的序列

    在大学里做了一些 Prolog 并做了一些练习之后 我决定进一步深入 尽管我必须承认我不太了解递归 我明白了概念和想法 但如何编码它对我来说仍然是一个问题 所以这就是为什么我很好奇是否有人知道如何帮助解决这个问题 这个想法有一个数字 例如4
  • 在不同目录中找到 SQLite 数据库

    一般SQLite数据库位于 data data PACKAGE NAME databases DBNAME但我发现数据库在 data user 0 PACKAGE NAME databases DBNAME一台设备中的路径 那么 为什么在单
  • 男孩的 htaccess 301 重定向

    我需要有关 httaccess 重写规则的帮助 我的一位客户说 网站 abc com 应该仅将来自 google bing 和 yahoo 搜索引擎机器人的流量 带有 301 重定向 发送到 cba com 否则显示 index html
  • 显示或重定向 shell 的作业控制消息

    TL DR 所有作业控制 崩溃消息在函数内出现时都会被隐藏 我将在下面详细介绍 但是 Barmar指出可以通过在函数内运行崩溃的二进制文件来重现此问题 例如 crun tmp faulty 1 2 3 我在我的中定义了一个函数 zshrc使