45 lines
1.1 KiB
Bash
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
|