gpt4 book ai didi

arrays - 保存并恢复陷阱状态?管理多个陷阱处理程序的简便方法?

转载 作者:行者123 更新时间:2023-11-29 08:46:18 24 4
gpt4 key购买 nike

什么是覆盖 bash 陷阱处理程序的好方法,这些处理程序不会永久践踏可能已设置或未设置的现有陷阱处理程序?动态管理任意陷阱例程链怎么样?

有没有办法保存陷阱处理程序的当前状态,以便以后可以恢复它们?

最佳答案

在 Bash 中保存和恢复陷阱处理程序状态

我会提交以下堆栈实现来跟踪和恢复陷阱状态。使用这种方法,我能够推送陷阱更改,然后在完成后将它们弹出。这也可用于将许多陷阱例程链接在一起。

查看以下源文件(.trap_stack.sh)

#!/bin/bash
trap_stack_name() {
local sig=${1//[^a-zA-Z0-9]/_}
echo "__trap_stack_$sig"
}

extract_trap() {
echo ${@:3:$(($#-3))}
}

get_trap() {
eval echo $(extract_trap `trap -p $1`)
}

trap_push() {
local new_trap=$1
shift
local sigs=$*
for sig in $sigs; do
local stack_name=`trap_stack_name "$sig"`
local old_trap=$(get_trap $sig)
eval "${stack_name}"'[${#'"${stack_name}"'[@]}]=$old_trap'
trap "${new_trap}" "$sig"
done
}

trap_pop() {
local sigs=$*
for sig in $sigs; do
local stack_name=`trap_stack_name "$sig"`
local count; eval 'count=${#'"${stack_name}"'[@]}'
[[ $count -lt 1 ]] && return 127
local new_trap
local ref="${stack_name}"'[${#'"${stack_name}"'[@]}-1]'
local cmd='new_trap=${'"$ref}"; eval $cmd
trap "${new_trap}" "$sig"
eval "unset $ref"
done
}

trap_prepend() {
local new_trap=$1
shift
local sigs=$*
for sig in $sigs; do
if [[ -z $(get_trap $sig) ]]; then
trap_push "$new_trap" "$sig"
else
trap_push "$new_trap ; $(get_trap $sig)" "$sig"
fi
done
}

trap_append() {
local new_trap=$1
shift
local sigs=$*
for sig in $sigs; do
if [[ -z $(get_trap $sig) ]]; then
trap_push "$new_trap" "$sig"
else
trap_push "$(get_trap $sig) ; $new_trap" "$sig"
fi
done
}

这可以管理定义为命名函数的处理程序,也可以管理像这个例子定义的临时例程 trap "kill $!"SIGTERM SIGINT.

这是我用来帮我写的测试脚本:

#!/bin/bash
source .trap_stack.sh

initial_trap='echo "messy" ;'" echo 'handler'"
non_f_trap='echo "non-function trap"'
f_trap() {
echo "function trap"
}

print_status() {
echo " SIGINT trap: `get_trap SIGINT`"
echo " SIGTERM trap: `get_trap SIGTERM`"
echo "-------------"
echo
}

echo "--- TEST START ---"
echo "Initial trap state (should be empty):"
print_status

echo 'Setting messy non-function handler for SIGINT ("original state")'
trap "$initial_trap" SIGINT
print_status

echo 'Pop empty stacks (still in original state)'
trap_pop SIGINT SIGTERM
print_status

echo 'Push non-function handler for SIGINT'
trap_push "$non_f_trap" SIGINT
print_status

echo 'Append function handler for SIGINT and SIGTERM'
trap_append f_trap SIGINT SIGTERM
print_status

echo 'Prepend function handler for SIGINT and SIGTERM'
trap_prepend f_trap SIGINT SIGTERM
print_status

echo 'Push non-function handler for SIGINT and SIGTERM'
trap_push "$non_f_trap" SIGINT SIGTERM
print_status

echo 'Pop both stacks'
trap_pop SIGINT SIGTERM
print_status

echo 'Prepend function handler for SIGINT and SIGTERM'
trap_prepend f_trap SIGINT SIGTERM
print_status

echo 'Pop both stacks thrice'
trap_pop SIGINT SIGTERM
trap_pop SIGINT SIGTERM
trap_pop SIGINT SIGTERM
print_status

echo 'Push non-function handler for SIGTERM'
trap_push "$non_f_trap" SIGTERM
print_status

echo 'Pop handler state for SIGINT (SIGINT is now back to original state)'
trap_pop SIGINT
print_status

echo 'Pop handler state for SIGTERM (SIGTERM is now back to original state)'
trap_pop SIGTERM
print_status

关于arrays - 保存并恢复陷阱状态?管理多个陷阱处理程序的简便方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16115144/

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