gpt4 book ai didi

shell - 在脚本和子 shell 中捕获信号

转载 作者:行者123 更新时间:2023-12-05 03:50:44 25 4
gpt4 key购买 nike

我知道有很多问题与我的类似,但我没有发现任何有关终端上发生子 shell 时发送的陷阱信号的信息。让我解释一下:

#!/bin/sh

trap 'echo "exiting.."; exit 0;' INT

var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)

fzf 是一个显示列表项选择器的工具,所以当程序到达 var1 a漂亮的选择器覆盖了我的终端屏幕,第一行提示 ab,第二行提示 ab,我使用箭头键选择所需的一个,然后打印结果。看起来很像 dmenu 使用这种方式。

问题是当 fzf 提示这些行时,Ctrl-C 不会被脚本困住。相反,Ctrl-C 会终止 fzf 但脚本会继续运行。
所以这里的问题更多的是关于如何将这个信号传播到父进程。

最佳答案

没有简单的方法可以将特定信号从子级传播到父级。但是,退出代码是 130如果程序在许多情况下被 Ctrl-C 终止。 fzf 也遵循它。检查退出状态并向自己的进程发送信号是解决方法之一。

#!/bin/sh
trap 'echo "exiting.."; exit 0;' INT

var1=$(echo "ab\nab" | fzf)
[ $? -eq 130 ] && kill -INT $$
var2=$(echo "cd\ncd" | fzf)
[ $? -eq 130 ] && kill -INT $$

然而,这不是常见的方式。如果它在因任何错误而终止时需要做一些事情,使用 set -e 并捕获 EXIT 或其他信号是通用的方法。

#!/bin/sh
set -e
trap 'echo "exiting.."; exit 0;' EXIT

var1=$(echo "ab\nab" | fzf)
var2=$(echo "cd\ncd" | fzf)

关于shell - 在脚本和子 shell 中捕获信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63367205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com