更新
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 标准错误处理模板
|
||||
# 所有新脚本和重构脚本应该使用这个模板
|
||||
|
||||
# ======= 标准错误处理设置 =======
|
||||
|
||||
# 加载公共库 (必须)
|
||||
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
if [[ -f "$SCRIPT_DIR/common.sh" ]]; then
|
||||
source "$SCRIPT_DIR/common.sh"
|
||||
else
|
||||
echo "错误: 无法加载公共库 common.sh" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 根据脚本类型选择错误处理模式
|
||||
|
||||
# 模式 1: 标准脚本 (推荐用于大多数脚本)
|
||||
# - 使用 common.sh 的错误处理
|
||||
# - 支持优雅退出和清理
|
||||
init_error_handling() {
|
||||
enable_error_handling
|
||||
log_info "脚本开始执行: ${BASH_SOURCE[1]##*/}"
|
||||
}
|
||||
|
||||
# 模式 2: 严格脚本 (用于安全关键脚本)
|
||||
# - 立即退出任何错误
|
||||
# - 适用于: input-validation.sh, secure-download.sh
|
||||
init_strict_error_handling() {
|
||||
set -euo pipefail
|
||||
log_info "脚本开始执行 (严格模式): ${BASH_SOURCE[1]##*/}"
|
||||
}
|
||||
|
||||
# 模式 3: 宽松脚本 (用于交互式脚本)
|
||||
# - 允许某些错误继续执行
|
||||
# - 适用于: 菜单脚本、用户交互脚本
|
||||
init_interactive_error_handling() {
|
||||
set -uo pipefail
|
||||
# 不使用 -e,允许交互式错误处理
|
||||
log_info "脚本开始执行 (交互模式): ${BASH_SOURCE[1]##*/}"
|
||||
}
|
||||
|
||||
# ======= 清理函数模板 =======
|
||||
|
||||
# 标准清理函数 - 每个脚本都应该实现
|
||||
cleanup() {
|
||||
local exit_code=${1:-0}
|
||||
|
||||
# 在这里添加脚本特定的清理逻辑
|
||||
# 例如:
|
||||
# - 删除临时文件
|
||||
# - 关闭网络连接
|
||||
# - 恢复系统状态
|
||||
|
||||
log_debug "清理操作完成 (退出码: $exit_code)"
|
||||
}
|
||||
|
||||
# ======= 使用示例 =======
|
||||
|
||||
# 在你的脚本中使用:
|
||||
#
|
||||
# #!/bin/bash
|
||||
# source "$(dirname "${BASH_SOURCE[0]}")/error-handling-template.sh"
|
||||
#
|
||||
# # 选择适合的错误处理模式
|
||||
# init_error_handling # 或 init_strict_error_handling 或 init_interactive_error_handling
|
||||
#
|
||||
# # 实现你的清理函数
|
||||
# cleanup() {
|
||||
# local exit_code=${1:-0}
|
||||
# rm -f /tmp/my_temp_file
|
||||
# log_debug "清理完成"
|
||||
# }
|
||||
#
|
||||
# # 你的脚本逻辑
|
||||
# main() {
|
||||
# log_info "开始主要功能"
|
||||
# # ... 你的代码 ...
|
||||
# }
|
||||
#
|
||||
# main "$@"
|
||||
|
||||
# ======= 最佳实践 =======
|
||||
|
||||
# 1. 总是使用 init_* 函数之一
|
||||
# 2. 总是实现 cleanup 函数
|
||||
# 3. 使用 log_* 函数而不是 echo 输出重要信息
|
||||
# 4. 对于临时文件,使用 register_temp_file 自动清理
|
||||
# 5. 对于交互式输入,验证用户输入
|
||||
# 6. 对于网络操作,添加超时和重试机制
|
||||
|
||||
export -f init_error_handling init_strict_error_handling init_interactive_error_handling
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,187 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 临时文件管理最佳实践指南
|
||||
# 展示如何正确使用 common.sh 的临时文件管理功能
|
||||
|
||||
# 加载公共库
|
||||
source "$(dirname "${BASH_SOURCE[0]}")/common.sh"
|
||||
|
||||
# ======= 推荐的临时文件使用方式 =======
|
||||
|
||||
# 方式 1: 使用 create_temp_file (推荐)
|
||||
demo_create_temp_file() {
|
||||
echo "=== 使用 create_temp_file 创建安全临时文件 ==="
|
||||
|
||||
# 创建临时文件,自动设置安全权限并注册清理
|
||||
local temp_file
|
||||
temp_file=$(create_temp_file)
|
||||
|
||||
echo "临时文件已创建: $temp_file"
|
||||
echo "文件权限: $(ls -l "$temp_file" | awk '{print $1}')"
|
||||
|
||||
# 使用临时文件
|
||||
echo "一些临时数据" > "$temp_file"
|
||||
echo "临时文件内容: $(cat "$temp_file")"
|
||||
|
||||
# 不需要手动删除 - 脚本退出时自动清理
|
||||
}
|
||||
|
||||
# 方式 2: 使用 create_temp_dir (推荐)
|
||||
demo_create_temp_dir() {
|
||||
echo "=== 使用 create_temp_dir 创建安全临时目录 ==="
|
||||
|
||||
# 创建临时目录,自动设置安全权限并注册清理
|
||||
local temp_dir
|
||||
temp_dir=$(create_temp_dir)
|
||||
|
||||
echo "临时目录已创建: $temp_dir"
|
||||
echo "目录权限: $(ls -ld "$temp_dir" | awk '{print $1}')"
|
||||
|
||||
# 使用临时目录
|
||||
echo "临时文件1" > "$temp_dir/file1.txt"
|
||||
echo "临时文件2" > "$temp_dir/file2.txt"
|
||||
echo "目录内容: $(ls "$temp_dir")"
|
||||
|
||||
# 不需要手动删除 - 脚本退出时自动清理
|
||||
}
|
||||
|
||||
# ======= 不推荐的方式 (仅用于对比) =======
|
||||
|
||||
# 不推荐: 手动管理临时文件
|
||||
demo_manual_temp_file() {
|
||||
echo "=== 不推荐: 手动管理临时文件 ==="
|
||||
|
||||
# 问题:
|
||||
# 1. 权限可能不安全
|
||||
# 2. 容易忘记清理
|
||||
# 3. 异常退出时可能泄露
|
||||
local temp_file="/tmp/manual_temp_$$_$(date +%s).txt"
|
||||
|
||||
echo "手动临时文件: $temp_file"
|
||||
echo "数据" > "$temp_file"
|
||||
|
||||
# 需要记住手动删除
|
||||
rm -f "$temp_file"
|
||||
}
|
||||
|
||||
# ======= 在现有脚本中集成临时文件管理 =======
|
||||
|
||||
# 如果你有现有的脚本使用手动临时文件,可以这样迁移:
|
||||
migrate_existing_script() {
|
||||
echo "=== 迁移现有脚本的示例 ==="
|
||||
|
||||
# 原来的代码 (不推荐):
|
||||
# local old_temp="/tmp/myapp_$$_$(date +%s).tmp"
|
||||
# echo "data" > "$old_temp"
|
||||
# # ... 使用文件 ...
|
||||
# rm -f "$old_temp"
|
||||
|
||||
# 迁移后的代码 (推荐):
|
||||
local new_temp
|
||||
new_temp=$(create_temp_file)
|
||||
echo "data" > "$new_temp"
|
||||
# ... 使用文件 ...
|
||||
# 自动清理,无需手动删除
|
||||
|
||||
echo "迁移完成,临时文件: $new_temp"
|
||||
}
|
||||
|
||||
# ======= 复杂场景的处理 =======
|
||||
|
||||
# 场景: 需要特定扩展名的临时文件
|
||||
demo_temp_with_extension() {
|
||||
echo "=== 带扩展名的临时文件 ==="
|
||||
|
||||
local temp_file
|
||||
temp_file=$(create_temp_file)
|
||||
|
||||
# 创建带扩展名的链接
|
||||
local yaml_temp="${temp_file}.yaml"
|
||||
ln -s "$temp_file" "$yaml_temp"
|
||||
|
||||
# 使用带扩展名的文件
|
||||
echo "key: value" > "$yaml_temp"
|
||||
echo "YAML 临时文件: $yaml_temp"
|
||||
|
||||
# 注册额外的清理
|
||||
TEMP_FILES="${TEMP_FILES:-} $yaml_temp"
|
||||
}
|
||||
|
||||
# 场景: 需要在特定目录创建临时文件
|
||||
demo_temp_in_specific_dir() {
|
||||
echo "=== 在特定目录创建临时文件 ==="
|
||||
|
||||
local work_dir="/tmp/myapp"
|
||||
mkdir -p "$work_dir"
|
||||
|
||||
# 在工作目录中创建临时文件
|
||||
local temp_file
|
||||
temp_file=$(mktemp -p "$work_dir")
|
||||
chmod 600 "$temp_file"
|
||||
|
||||
# 注册清理
|
||||
TEMP_FILES="${TEMP_FILES:-} $temp_file"
|
||||
|
||||
echo "特定目录的临时文件: $temp_file"
|
||||
echo "数据" > "$temp_file"
|
||||
}
|
||||
|
||||
# ======= 错误处理和清理 =======
|
||||
|
||||
# 实现自定义清理函数
|
||||
cleanup() {
|
||||
local exit_code=${1:-0}
|
||||
|
||||
echo "开始自定义清理..."
|
||||
|
||||
# 先调用标准清理 (来自 common.sh)
|
||||
# 这会自动清理所有注册的临时文件和目录
|
||||
|
||||
# 添加其他清理逻辑
|
||||
echo "执行额外的清理操作..."
|
||||
|
||||
echo "清理完成 (退出码: $exit_code)"
|
||||
}
|
||||
|
||||
# ======= 运行演示 =======
|
||||
|
||||
main() {
|
||||
enable_error_handling
|
||||
log_info "开始临时文件管理演示"
|
||||
|
||||
demo_create_temp_file
|
||||
echo ""
|
||||
|
||||
demo_create_temp_dir
|
||||
echo ""
|
||||
|
||||
demo_manual_temp_file
|
||||
echo ""
|
||||
|
||||
migrate_existing_script
|
||||
echo ""
|
||||
|
||||
demo_temp_with_extension
|
||||
echo ""
|
||||
|
||||
demo_temp_in_specific_dir
|
||||
echo ""
|
||||
|
||||
log_info "演示完成,等待清理..."
|
||||
sleep 1
|
||||
|
||||
# 脚本退出时,所有临时文件将自动清理
|
||||
}
|
||||
|
||||
# ======= 使用说明 =======
|
||||
|
||||
# 在你的脚本中:
|
||||
# 1. source common.sh
|
||||
# 2. 使用 create_temp_file 或 create_temp_dir
|
||||
# 3. 实现自定义的 cleanup 函数(可选)
|
||||
# 4. 调用 enable_error_handling 启用自动清理
|
||||
|
||||
# 如果脚本作为模块运行,不执行 main
|
||||
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
|
||||
main "$@"
|
||||
fi
|
||||
Reference in New Issue
Block a user