为什么 trap INT 和 trap EXIT 不立即停止这个脚本的执行?

问题描述 投票:0回答:1

在下面的脚本中,我为 INT (SIGINT) 和 EXIT 设置了陷阱,并且我知道当发送 CTRL+C (SIGINT) 时,会触发陷阱 INT,并且脚本将继续执行直至完成,而使用EXIT,脚本执行完后立即退出。

这是一个表现符合预期的示例:

# Function to handle traps
function handle_trap {
    echo "Trap triggered"
}

# Trap INT and EXIT
trap handle_trap INT
trap handle_trap EXIT

# Simulate some steps
echo "Running step 1..."
sleep 3

echo "Running step 2..."
sleep 3

echo "Running step 3..."
sleep 3

echo "Completed script execution."

当我在睡眠命令期间按 CTRL+C (SIGINT) 时,会触发handle_trap 函数,但脚本会继续运行直到结束。这种行为我很清楚。

但是,在以下示例中:

我正在运行一个安装 Foundry 的 bash 脚本。当我强行停止安装过程(例如,按 CTRL+C)时,Foundry 安装会按预期停止。但是,脚本的其余部分继续执行而不是立即退出。

# Function to handle traps
function handle_trap {
    echo "Trap triggered"
}

# Trap INT and EXIT
trap handle_trap INT
trap handle_trap EXIT

# Install foundry
foundryup. 

# Simulate some steps
echo "Running step 1..."
sleep 3

echo "Running step 2..."
sleep 3

echo "Running step 3..."
sleep 3

echo "Completed script execution."

当我在睡眠命令期间按 CTRL+C 时,我希望脚本立即停止,但相反,会打印陷阱消息(“陷阱已触发”),并且脚本在停止之前继续执行下一步。

为什么脚本在捕获 INT 或 EXIT 后继续执行而不是立即停止? 如何确保脚本在处理陷阱后立即停止?

  • 我想要的是,当强制停止 Foundry 安装时,脚本会在该特定点停止,并且脚本的后续部分停止执行。

任何帮助理解此行为并修复它的帮助将不胜感激!

linux bash zsh
1个回答
0
投票

为什么 trap INT 不立即停止这个脚本的执行?

因为它没有在您的脚本中配置为这样做。

为什么 trap EXIT 不立即停止这个脚本的执行?

这个问题包含一个错误的前提。确实如此。

如何确保脚本在处理陷阱后立即停止?

exit
脚本。

handle_trap() {
    echo "Trap triggered"
    exit 123
}
trap handle_trap INT
© www.soinside.com 2019 - 2024. All rights reserved.