问题标签 [bash-trap]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
627 浏览

bash - Bash——陷阱 CTRL+C 重置终端属性并结束无限循环

所以我有这个无限循环来改变终端属性,比如前景色/背景色。

规格:CTRL+C按下时,在退出循环/脚本之前,它应该将终端重置为原始属性。

现在我想我需要捕获CTRL+C并以某种方式使用setterm reset来重置终端,但似乎无法集成到脚本中。

当我在 while 循环之外捕获CTRL+C, 时,它不会重置终端。它在无限循环中也不起作用。

退出后,终端属性保持不变,

例子:

如何捕获CTRL+C、重置终端和退出?

0 投票
1 回答
2017 浏览

linux - Bash:使用管道运算符时陷阱 ERR 不起作用

我正在尝试将来自 stdout 和 stderr 的所有内容记录到日志文件中,并且仍然保留控制台。为此,我只是将:附加|& tee -a log_file.log到每个命令。
但是,如果脚本期间发生任何错误,我也想运行自定义命令。为此,我在脚本的开头添加了以下内容:trap "echo Non-zero exit code detected" ERR.
问题是通过使用管道运算符,陷阱中的回显不再执行。

脚本 1,没有管道:

输出 1:

脚本 2,带管道:

输出 2:

在输出 2 中,消息“检测到非零退出代码!” 不见了。知道为什么吗?谢谢!

0 投票
1 回答
392 浏览

bash - 如何将 1 美元传递给陷阱和信号

我是一个 bash 新手!

我的 .bash_profile 中有上述陷阱和信号代码。要触发sigusr1,我只需Kill -SIGUSR1 pid在终端中调用。我用谷歌搜索了如何将参数传递给sigusr1但我找不到任何东西,除非我将它用作陷阱'sigusr1 hello'SIGUSR1

但这违背了目的。我想通过终端传入参数。如何通过 kill 命令传入参数,以便sigusr1函数可以将其回显?

0 投票
0 回答
102 浏览

bash - 获取存储在别名中的源文件的名称

我正在尝试向我的 bashrc 库添加一些错误检查。它们是模块化的并加载在 for 循环中:

我使用一个标志来启用调试(如果我试图排除故障)。我已经以多种不同的方式重写了以下函数,但无论如何都没有找到提供发生错误的源脚本的名称。我尝试禁用 pipefail,尝试解析 $rcfile 的值,尝试捕获参数并将其显式传递给陷阱等。我故意没有设置 errexit,因为我没有当我遇到错误时希望我的 shell 退出 - 我只想要有意义的输出。:) 这是我目前拥有的:

当我尝试加载包含错误的文件时,它会生成如下输出:

引用的 bashrc 行是 for 循环(如上所示)源 $rcfile 中的行。回溯也引用了我的 .bash_profile ,因为 .bashrc 来自它。这很有帮助,但我真正要查找的是发生错误的源文件中的文件名和行号。

编辑
此片段显示来自BASH_SOURCE数组的输出并遍历调用者堆栈。

它会导致以下输出,这表明无法获取源的脚本不在 BASH_SOURCE 或调用者框架中:

列出的三个项目是:

  1. .bash/lib/debug.bash(这是来源并包含_err_handler & traceback)
  2. .bashrc(由 .bash_profile 获取并运行循环以获取目录中的所有文件)
  3. .bash_profile,其来源 .bashrc
0 投票
3 回答
1312 浏览

bash - 递归 bash 陷阱以调用函数

我创建了一个 bash 陷阱,它捕获CTRL+C并调用函数 ctrl_c。这个函数只是显示一条消息并启动一个计数器然后返回到主函数。

陷阱在第一次运行时工作正常,但如果第二次尝试它会显示 C^ 尽管它确实禁用了 CTRL + C 它不会再次调用该函数。

有没有办法将陷阱重置为像第一个实例一样运行。

提前致谢。

代码;

0 投票
1 回答
351 浏览

ruby - ruby 脚本后清理——捕获信号

我的 ruby​​ 脚本创建了一个临时文件并产生了一个可能长时间运行的外部进程。无论脚本以何种方式终止,脚本结束后两者都不能继续存在。

我认为以下几行会解决问题:

他们应该是对以下 bash 代码的重写,这似乎工作正常,

但他们没有。如果稍后引发异常,则生成的进程不会死,否则会死。

谁能告诉我我做错了什么?

编辑:陷阱确实有效。上面的代码有多个瑕疵:

  1. Tempfile 自行处理——它很可能已经在陷阱处理程序中被删除,这可能会导致 FileUtils.rm_f 引发另一个错误,从而阻止。
  2. Process.kill 需要一个信号—— Process.kill “TERM”、pid(或“KILL”)。引发的错误掩盖了我错误调用 Process.kill 的错误。

固定代码:

Ensure也可以。

0 投票
1 回答
509 浏览

bash - Bash脚本,陷阱功能不起作用

我编写了一个 shell 脚本,它运行大型模拟并将内容存储到一个临时文件中。我trap在收到SIGINT. 问题是,清理工作没有发生。我使用-x调试选项运行,并且rm命令已执行。尽管如此,该文件仍然存在。

代码:

这是与-x选项一起使用时的输出的一部分,正如您所看到的那样exit_prog被调用。

0 投票
1 回答
304 浏览

bash - pgrep -P $$ 给出一个不存在的进程 id

它输出

它只发生在陷阱中。为什么将不存在的 PID 附加到数组?以及如何避免这种奇怪的行为?

0 投票
2 回答
4047 浏览

linux - ctrl+c 杀死带有子进程的 bash 脚本

我有一个脚本,其内部可归结为:

(是的,它上面更有意义,但这与问题无关)。脚本的多个实例可能同时运行。

有时我想 ^C 脚本......但这没有成功。据我了解,当 ^C 杀死时mplayer,它会继续sleep,当 ^C 杀死时sleep,它会继续mplayer,而且我从来没有碰巧在两者之间抓住它。据我了解,trap只是永远不会工作。

如何终止脚本?

0 投票
1 回答
195 浏览

linux - bash中信号之间的最短时间

我正在尝试制作一个使用 hostapd 启动/停止访问点的 bash 脚本。

我们有一个极端情况,我们想尽快切换到另一个 wifi 频道,并且由于 hostapd 不支持即时频道交换,我们必须:

  • 杀死进程
  • 更改配置文件
  • 再次启动hostapd。

我决定将信号从主应用程序发送到此脚本(USR1 和 USR2)来执行此操作,但我没有得到预期的结果。我总是首先收到第二个信号,所以它不起作用。我试图在代码中添加一个 sleep(1) 以使其工作,但这不是一个优雅的解决方案。

这是我正在使用的 c++ 行,

这就是脚本。

欢迎任何想法。

非常感谢!!