Files
build_infra/linux_shell/build_script/pragma_once.bash
T
2026-06-16 10:23:51 +08:00

45 lines
1.1 KiB
Bash

#!/bin/bash
# shellcheck disable=SC2155
if declare -p _global_pragma_once_sign &>/dev/null; then
return 0;
fi
readonly _global_pragma_once_sign=true
declare loaded_scripts_map="" # 关联数组不知道为什么有bug
pragma_once() {
# 1. 转换为绝对路径以确保唯一性
local abs_path
abs_path=$(realpath "$1" 2>/dev/null || echo "$1")
if [ ! -e "$abs_path" ]; then
echo "错误: 文件 '$1' 不存在。"
exit 1
fi
# 2. 生成 Key(只保留字母数字,其他转下划线)
local key="key_$(echo "$abs_path" | sed 's/[^a-zA-Z0-9]/_/g')"
# 3. 精确匹配检查
# 我们在 map 的两端和 key 的两端都加上分隔符 |
if [[ "$loaded_scripts_map" == *"|$key|"* ]]; then
return 1 # 已经加载过了
else
# 第一次加载,存入时带上分隔符
# 如果 map 为空,初始化为 |key|;如果不为空,追加 key|
if [[ -z "$loaded_scripts_map" ]]; then
loaded_scripts_map="|$key|"
else
loaded_scripts_map="${loaded_scripts_map}${key}|"
fi
return 0 # 允许加载
fi
}
# 使用方式
# if pragma_once "${BASH_SOURCE[0]}"; then
# fi