fix: 修复 tar 命令输出干扰函数返回值的问题

问题描述:
- backup_folders() 函数使用 echo 返回文件路径
- 但 tar 命令的 2>&1 将 stderr 重定向到 stdout
- tar 的警告信息(如 "Removing leading '/' from member names")
  被 $(backup_folders) 捕获到 folders_tar 变量
- 导致 merge_backups() 收到的不是文件路径而是 tar 输出
- 最终备份文件中缺少 folders 目录

修复方案:
- 将 tar 命令改为 2>&1 >&2
- 先将 stderr 重定向到 stdout (2>&1)
- 再将合并后的 stdout 重定向到 stderr (>&2)
- 确保 tar 的所有输出都到 stderr,不干扰函数返回值

影响:
- 修复后文件夹备份会正确包含在最终备份文件中
- 用户可以正常恢复文件夹数据
This commit is contained in:
Wang Defa
2025-12-25 15:49:14 +08:00
parent fe57dd33f4
commit 31f111d812

View File

@@ -209,7 +209,8 @@ backup_folders() {
# 执行打包 # 执行打包
log_info "开始打包文件夹..." log_info "开始打包文件夹..."
log_info "排除规则: ${exclude_args}" log_info "排除规则: ${exclude_args}"
if eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" 2>&1; then # 将 tar 输出重定向到 stderr避免干扰函数返回值
if eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" 2>&1 >&2; then
local tar_size=$(du -h "${folders_tar}" | cut -f1) local tar_size=$(du -h "${folders_tar}" | cut -f1)
log_info "文件夹备份完成: ${folders_tar} (大小: ${tar_size})" log_info "文件夹备份完成: ${folders_tar} (大小: ${tar_size})"
echo "${folders_tar}" echo "${folders_tar}"