问题标签 [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 投票
2 回答
514 浏览

java - 使用 shell 脚本运行 jar 文件时限制终止命令

我有一个 jar 文件,它是一个接受用户输入并处理它的程序。我正在使用下面的 shell 脚本运行这个 jar 文件:

我面临的问题是,我想限制用户使用以下命令的任何组合退出应用程序。例如:

请帮我。

0 投票
1 回答
315 浏览

bash - 如何使用陷阱终止包含来自/dev/null 的重定向馈送的ffmpeg 的while 循环?

我在这里发现循环调用过程需要很长时间才能完成。我该如何摆脱它?从 find 到调用 ffmpeg cli [HandBrakeCLI] 的 while 循环的管道将不会处理多个输入文件,因为 ffmpeg 有一个怪癖,它会一次性“吃掉”所有输入列表并“饿死”循环。

解决方案是根据http://mywiki.wooledge.org/BashFAQ/089/dev/null重定向,并且效果很好。然而,它让我回到了最初的问题和我要解决的问题:

因为 /dev/null 现在有一个完整的列表,包含所有提供给 HandBrakeCLI 的文件,ctrl-c 本身不足以退出循环。

我已经尝试了各种陷阱排列,但除了停止 HandBrakeCLI 处理当前输入之前,我无法让它做任何事情,然后再继续下一个。它不是立即终止循环,而是在 HandBrakeCLI 行之后立即处理 mv。

所以,有两件事我在这里没有得到: 1. 如何使用 ctrl-c 或 kill 命令终止所有内容?2、如(1.)未处理,如何防止循环内的mv被执行?

为了解决这个问题,这是代码的简化版本:

0 投票
0 回答
99 浏览

bash - 为什么没有发生递归陷阱调用?

我有一个名为 unions.sh 的 bash 脚本:

当我运行 ./unions.sh -h 时,输出是

我在这里有一个疑问。当我在帮助函数中使用出口时,它调用了 _cleanup 函数。我在 _cleanup 函数中有相同的出口。为什么不应该再次调用 _cleanup 函数?

0 投票
0 回答
256 浏览

bash - 嵌套 bash 脚本中的错误处理

我有一组 sh 脚本:

这是 Ubuntu 上的安装程序。我目前没有错误处理机制。我想建立一种机制,同时每个脚本中的每个命令都在执行并返回不同于 0 的退出代码 - 发送失败的行并向我发送电子邮件。类似于:'set -e',但有一个函数在它发生时被调用并通过电子邮件向我发送信息。

我在 trap.sh 文件中尝试了这样的陷阱:

在我制作的每个脚本中:

我像这样运行它:

我从 Main.sh 调用:

等等。

但它不工作。它不会进入陷阱。任何人都可以用一个例子来建议如何做到这一点,以及一个好的陷阱方法来发送带有错误、脚本名称和行失败的电子邮件吗?也许我没有很好地调用嵌套脚本?也许我必须在每个脚本的末尾加上“return 0”?

非常感谢

0 投票
1 回答
3492 浏览

linux - 如何让 bash 中的 RETURN 陷阱保留返回码?

下面是我正在编写的脚本的简化方案。程序必须以不同的方式获取参数,因此对几个功能进行了精细划分。

问题是来自更深层函数的返回值的链式加载在陷阱上中断,在该陷阱中将检查结果以显示消息。

它应该如何工作:

这个想法是,如果检查失败,它的返回代码也会强制check_params()返回,这反过来会触发|| ask_for_params. setup()但是陷阱返回 0:

如果您尝试按原样运行脚本,您应该会看到

这意味着错误的结果触发了陷阱(!),但设置它的母函数没有传递结果。

为了尝试设置黑客,我尝试过

  • 将 retval 设置为全局变量declare -g retval=$?return_trap()并在设置陷阱的行中使用其值。变量已设置([ -v retval ]成功返回),但……没有值。有趣的。
  • 好吧,让我们把retval=Eeh,放在check_params()外面,return_trap()然后把它设置$?为一个通常的参数。不,retval函数中的 没有设置全局变量的值,它保持“Eeh”。不,没有local指令。默认情况下应将其视为全局。如果你把test=1tocheck_params()test=3incheck_a_param()然后echo $test在结尾加上 打印setup(),你应该会看到 3。至少我会看到。declare -g正如预期的那样,这里没有任何区别。
  • 也许这就是功能的范围?不,也不是这样。return_trap()一起移动declare -g retval=Eeh没有任何区别。
  • 当现代软件意味着堕落时,是时候求助于旧的文件写入了。retval=$?; echo $retval >/tmp/t让我们用in将 retval 打印到 /tmp/treturn_trap()并用

    trap "return_trap; trap - RETURN; return $(</tmp/t)" RETURN

现在我们终于可以看到,最后一个从文件中读取数字的返回指令实际上返回了 3。但check_params()仍然返回 0!


如果trap命令的参数严格来说是函数名,则返回原始结果。原始的,而不是return_trap()返回的。我尝试增加结果,但仍然得到 3。您可能还会问“为什么需要如此多地解除陷阱?”。这是为了避免另一个错误,这会导致陷阱每次都触发,即使check_params()是从另一个函数调用时也是如此。RETURN 上的陷阱是本地事物,除非在它们上显式设置了调试或跟踪标志,否则它们不会被其他函数继承,但看起来它们在运行之间保持设置陷阱。或者 bash 为他们设置陷阱。仅当从特定函数调用 check_params() 时才应设置此陷阱,但如果未取消设置陷阱,则每次都会继续触发check_a_param()返回一个大于零的值,与FUNCNAME[1].

这里我放弃了,因为我现在看到的唯一出口是在每个|| return $?in之前实现对调用函数的检查check_params()。但它太丑了,我的眼睛很疼。

我只能补充一点,$?在设置的行中,陷阱将始终返回 0。因此,例如,如果您在 中声明一个变量local,并放置这样的代码来检查它retvalreturn_trap()

无论是否retval实际设置,它都会打印 0 ,但如果你使用

它将打印“未设置”。


GNU bash,版本 4.3.39(1)-release (x86_64-pc-linux-gnu)

0 投票
2 回答
574 浏览

linux - 通过 ssh 发送 Ctrl_C

在我的许多服务器上,autofs 已挂起,并且一个进程正在尝试访问挂载,当我 ssh 到远程主机时,它一直挂在那里,直到我按下键盘上的Crtl+C

但是当我按Crtl+时C,它会进入提示

我正在尝试通过 ssh 发送陷阱信号,但这也挂起

解决此问题的任何帮助。

0 投票
1 回答
804 浏览

bash - 进程退出时未传递 SIGCHLD

我需要检测我的一个后台进程何时退出。因此,我安装了一个陷阱。run_gui并且run_ai1是简单的exec函数。

当我关闭 GUI 时,什么也没有发生。仅当我按 ctrl+c 时才会执行该echo foo命令。

为什么我错过了SIGCHLD

0 投票
2 回答
468 浏览

bash - bash 陷阱'' vs 陷阱函数传递信号

我对将信号转发到带有陷阱的子进程感到困惑。假设我有两个脚本:

b.sh

如果我执行a.sh然后从另一个窗口用 杀死进程组kill -- -PGID,则 SIGTERM 将被忽略并且不会传递给b.sh. 但如果我这样做trap cleanup SIGTERM,SIGTERM 会通过并终止b.sh。为什么我的陷阱在一种情况下传递信号而不是另一种情况?

0 投票
2 回答
2414 浏览

linux - 检查是否在 Bash 中设置了陷阱

有没有办法检查什么trap在 Bash 中设置了什么(在当前会话或脚本中)?

理想情况下,我希望能够获得trap分配给它们的信号列表,但如果这不可能,我可以单独检查每个信号。

0 投票
1 回答
49 浏览

bash - Bash:忽略SIGNT(ctrl-c)x次

所以,在这个程序中,使用 BASH,我试图CTRL-C在它之前多次忽略或捕获(不是无限的)。

目前我知道如何忽略该命令一次。但我不知道如何增加或减少它被忽略的次数。

代码:

谢谢