From 7d42577fb26ae22a10bc023565d38cda2d97a70d Mon Sep 17 00:00:00 2001 From: Wang Defa <2-wangdefa@users.noreply.gitlab.bcde.io> Date: Thu, 25 Dec 2025 15:52:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=20tar=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=E9=87=8D=E5=AE=9A=E5=90=91=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题: - 之前使用 if...then 包裹 tar 命令时的重定向 2>&1 >&2 会影响整个 if 语句块,包括后续的 echo 输出 - 导致 echo "${folders_tar}" 的输出也被重定向到 stderr - 使得 $(backup_folders) 无法捕获返回的文件路径 修复: - 将 tar 命令独立执行,使用 >&2 2>&1 重定向所有输出到 stderr - 将 if 条件改为检查文件是否存在 [[ -f "${folders_tar}" ]] - 这样 echo 输出不受重定向影响,可以正常返回路径 重定向说明: - `>&2` 先将 stdout 重定向到 stderr - `2>&1` 再将 stderr 重定向到 stdout(此时已经是 stderr) - 最终效果:tar 的所有输出都到 stderr,不干扰函数返回值 --- bin/backup.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/bin/backup.sh b/bin/backup.sh index 7dc32a5..eda767b 100755 --- a/bin/backup.sh +++ b/bin/backup.sh @@ -209,8 +209,10 @@ backup_folders() { # 执行打包 log_info "开始打包文件夹..." log_info "排除规则: ${exclude_args}" - # 将 tar 输出重定向到 stderr,避免干扰函数返回值 - if eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" 2>&1 >&2; then + # 将 tar 的 stdout 和 stderr 都重定向到 stderr,避免干扰函数返回值 + eval "tar -czf '${folders_tar}' ${exclude_args} ${tar_sources}" >&2 2>&1 + + if [[ -f "${folders_tar}" ]]; then local tar_size=$(du -h "${folders_tar}" | cut -f1) log_info "文件夹备份完成: ${folders_tar} (大小: ${tar_size})" echo "${folders_tar}"