问题标签 [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.
java - 使用 shell 脚本运行 jar 文件时限制终止命令
我有一个 jar 文件,它是一个接受用户输入并处理它的程序。我正在使用下面的 shell 脚本运行这个 jar 文件:
我面临的问题是,我想限制用户使用以下命令的任何组合退出应用程序。例如:
请帮我。
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被执行?
为了解决这个问题,这是代码的简化版本:
bash - 为什么没有发生递归陷阱调用?
我有一个名为 unions.sh 的 bash 脚本:
当我运行 ./unions.sh -h 时,输出是
我在这里有一个疑问。当我在帮助函数中使用出口时,它调用了 _cleanup 函数。我在 _cleanup 函数中有相同的出口。为什么不应该再次调用 _cleanup 函数?
bash - 嵌套 bash 脚本中的错误处理
我有一组 sh 脚本:
这是 Ubuntu 上的安装程序。我目前没有错误处理机制。我想建立一种机制,同时每个脚本中的每个命令都在执行并返回不同于 0 的退出代码 - 发送失败的行并向我发送电子邮件。类似于:'set -e',但有一个函数在它发生时被调用并通过电子邮件向我发送信息。
我在 trap.sh 文件中尝试了这样的陷阱:
在我制作的每个脚本中:
我像这样运行它:
我从 Main.sh 调用:
等等。
但它不工作。它不会进入陷阱。任何人都可以用一个例子来建议如何做到这一点,以及一个好的陷阱方法来发送带有错误、脚本名称和行失败的电子邮件吗?也许我没有很好地调用嵌套脚本?也许我必须在每个脚本的末尾加上“return 0”?
非常感谢
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=1
tocheck_params()
和test=3
incheck_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
,并放置这样的代码来检查它retval
return_trap()
无论是否retval
实际设置,它都会打印 0 ,但如果你使用
它将打印“未设置”。
GNU bash,版本 4.3.39(1)-release (x86_64-pc-linux-gnu)
linux - 通过 ssh 发送 Ctrl_C
在我的许多服务器上,autofs 已挂起,并且一个进程正在尝试访问挂载,当我 ssh 到远程主机时,它一直挂在那里,直到我按下键盘上的Crtl+C
但是当我按Crtl+时C,它会进入提示
我正在尝试通过 ssh 发送陷阱信号,但这也挂起
解决此问题的任何帮助。
bash - 进程退出时未传递 SIGCHLD
我需要检测我的一个后台进程何时退出。因此,我安装了一个陷阱。run_gui
并且run_ai1
是简单的exec
函数。
当我关闭 GUI 时,什么也没有发生。仅当我按 ctrl+c 时才会执行该echo foo
命令。
为什么我错过了SIGCHLD
?
bash - bash 陷阱'' vs 陷阱函数传递信号
我对将信号转发到带有陷阱的子进程感到困惑。假设我有两个脚本:
灰
b.sh
如果我执行a.sh
然后从另一个窗口用 杀死进程组kill -- -PGID
,则 SIGTERM 将被忽略并且不会传递给b.sh
. 但如果我这样做trap cleanup SIGTERM
,SIGTERM 会通过并终止b.sh
。为什么我的陷阱在一种情况下传递信号而不是另一种情况?
linux - 检查是否在 Bash 中设置了陷阱
有没有办法检查什么trap
在 Bash 中设置了什么(在当前会话或脚本中)?
理想情况下,我希望能够获得trap
分配给它们的信号列表,但如果这不可能,我可以单独检查每个信号。
bash - Bash:忽略SIGNT(ctrl-c)x次
所以,在这个程序中,使用 BASH,我试图CTRL-C在它之前多次忽略或捕获(不是无限的)。
目前我知道如何忽略该命令一次。但我不知道如何增加或减少它被忽略的次数。
代码:
谢谢