问题标签 [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.
bash - Bash——陷阱 CTRL+C 重置终端属性并结束无限循环
所以我有这个无限循环来改变终端属性,比如前景色/背景色。
规格:CTRL+C
按下时,在退出循环/脚本之前,它应该将终端重置为原始属性。
现在我想我需要捕获CTRL+C
并以某种方式使用setterm reset
来重置终端,但似乎无法集成到脚本中。
当我在 while 循环之外捕获CTRL+C
, 时,它不会重置终端。它在无限循环中也不起作用。
退出后,终端属性保持不变,
例子:
如何捕获CTRL+C
、重置终端和退出?
linux - Bash:使用管道运算符时陷阱 ERR 不起作用
我正在尝试将来自 stdout 和 stderr 的所有内容记录到日志文件中,并且仍然保留控制台。为此,我只是将:附加|& tee -a log_file.log
到每个命令。
但是,如果脚本期间发生任何错误,我也想运行自定义命令。为此,我在脚本的开头添加了以下内容:trap "echo Non-zero exit code detected" ERR
.
问题是通过使用管道运算符,陷阱中的回显不再执行。
脚本 1,没有管道:
输出 1:
脚本 2,带管道:
输出 2:
在输出 2 中,消息“检测到非零退出代码!” 不见了。知道为什么吗?谢谢!
bash - 如何将 1 美元传递给陷阱和信号
我是一个 bash 新手!
我的 .bash_profile 中有上述陷阱和信号代码。要触发sigusr1
,我只需Kill -SIGUSR1 pid
在终端中调用。我用谷歌搜索了如何将参数传递给sigusr1
但我找不到任何东西,除非我将它用作陷阱'sigusr1 hello'SIGUSR1
但这违背了目的。我想通过终端传入参数。如何通过 kill 命令传入参数,以便sigusr1
函数可以将其回显?
bash - 获取存储在别名中的源文件的名称
我正在尝试向我的 bashrc 库添加一些错误检查。它们是模块化的并加载在 for 循环中:
我使用一个标志来启用调试(如果我试图排除故障)。我已经以多种不同的方式重写了以下函数,但无论如何都没有找到提供发生错误的源脚本的名称。我尝试禁用 pipefail,尝试解析 $rcfile 的值,尝试捕获参数并将其显式传递给陷阱等。我故意没有设置 errexit,因为我没有当我遇到错误时希望我的 shell 退出 - 我只想要有意义的输出。:) 这是我目前拥有的:
当我尝试加载包含错误的文件时,它会生成如下输出:
引用的 bashrc 行是 for 循环(如上所示)源 $rcfile 中的行。回溯也引用了我的 .bash_profile ,因为 .bashrc 来自它。这很有帮助,但我真正要查找的是发生错误的源文件中的文件名和行号。
编辑
此片段显示来自BASH_SOURCE
数组的输出并遍历调用者堆栈。
它会导致以下输出,这表明无法获取源的脚本不在 BASH_SOURCE 或调用者框架中:
列出的三个项目是:
- .bash/lib/debug.bash(这是来源并包含_err_handler & traceback)
- .bashrc(由 .bash_profile 获取并运行循环以获取目录中的所有文件)
- .bash_profile,其来源 .bashrc
bash - 递归 bash 陷阱以调用函数
我创建了一个 bash 陷阱,它捕获CTRL+C并调用函数 ctrl_c。这个函数只是显示一条消息并启动一个计数器然后返回到主函数。
陷阱在第一次运行时工作正常,但如果第二次尝试它会显示 C^ 尽管它确实禁用了 CTRL + C 它不会再次调用该函数。
有没有办法将陷阱重置为像第一个实例一样运行。
提前致谢。
代码;
ruby - ruby 脚本后清理——捕获信号
我的 ruby 脚本创建了一个临时文件并产生了一个可能长时间运行的外部进程。无论脚本以何种方式终止,脚本结束后两者都不能继续存在。
我认为以下几行会解决问题:
他们应该是对以下 bash 代码的重写,这似乎工作正常,
但他们没有。如果稍后引发异常,则生成的进程不会死,否则会死。
谁能告诉我我做错了什么?
编辑:陷阱确实有效。上面的代码有多个瑕疵:
- Tempfile 自行处理——它很可能已经在陷阱处理程序中被删除,这可能会导致 FileUtils.rm_f 引发另一个错误,从而阻止。
- Process.kill 需要一个信号—— Process.kill “TERM”、pid(或“KILL”)。引发的错误掩盖了我错误调用 Process.kill 的错误。
固定代码:
Ensure
也可以。
bash - Bash脚本,陷阱功能不起作用
我编写了一个 shell 脚本,它运行大型模拟并将内容存储到一个临时文件中。我trap
在收到SIGINT
. 问题是,清理工作没有发生。我使用-x
调试选项运行,并且rm
命令已执行。尽管如此,该文件仍然存在。
代码:
这是与-x
选项一起使用时的输出的一部分,正如您所看到的那样exit_prog
被调用。
bash - pgrep -P $$ 给出一个不存在的进程 id
它输出
它只发生在陷阱中。为什么将不存在的 PID 附加到数组?以及如何避免这种奇怪的行为?
linux - ctrl+c 杀死带有子进程的 bash 脚本
我有一个脚本,其内部可归结为:
(是的,它比上面更有意义,但这与问题无关)。脚本的多个实例可能同时运行。
有时我想 ^C 脚本......但这没有成功。据我了解,当 ^C 杀死时mplayer
,它会继续sleep
,当 ^C 杀死时sleep
,它会继续mplayer
,而且我从来没有碰巧在两者之间抓住它。据我了解,trap
只是永远不会工作。
如何终止脚本?
linux - bash中信号之间的最短时间
我正在尝试制作一个使用 hostapd 启动/停止访问点的 bash 脚本。
我们有一个极端情况,我们想尽快切换到另一个 wifi 频道,并且由于 hostapd 不支持即时频道交换,我们必须:
- 杀死进程
- 更改配置文件
- 再次启动hostapd。
我决定将信号从主应用程序发送到此脚本(USR1 和 USR2)来执行此操作,但我没有得到预期的结果。我总是首先收到第二个信号,所以它不起作用。我试图在代码中添加一个 sleep(1) 以使其工作,但这不是一个优雅的解决方案。
这是我正在使用的 c++ 行,
这就是脚本。
欢迎任何想法。
非常感谢!!