You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ksh中如何将pax的stderr管道至进度脚本且不干扰stdout?

在ksh中实现pax+SSH的备份进度报告

核心修改方案

要在不干扰stdout的前提下,将pax的stderr(-v选项输出的文件名)导向progress函数,可通过ksh的文件描述符重定向实现。修改原脚本的关键行为:

echo "$target" | pax -r -v 3>&1 2>&1 >&3 | progress 3>&-

完整脚本

#!/usr/bin/ksh

# 替换为你的目标备份目录
target="/path/to/target/dir"

# 统计目标目录下的文件总数(作为进度计算基数)
file_count=$(find "$target" -type f | wc -l)
count=0

progress() {
  while [ $((++count)) -lt $file_count ]; do
    # 将进度输出到stderr,避免干扰备份数据的stdout流
    echo -n "$((count * 100 / file_count))%
" 1>&2
    read
  done
  echo "100%" 1>&2
}

# 关键行:分离stderr到progress函数,保留stdout正常传输
echo "$target" | pax -r -v 3>&1 2>&1 >&3 | progress 3>&-

重定向逻辑说明

  • 3>&1:先将文件描述符3绑定到当前的stdout(即备份数据的输出目标,比如SSH连接)
  • 2>&1:把pax的stderr重定向到stdout,使其进入管道传递给progress函数
  • >&3:将stdout恢复为原始输出目标(通过之前保存的文件描述符3)
  • 3>&-:关闭文件描述符3,释放资源

注意事项

  • 若目标目录存在大量文件,find统计可能耗时较长,可根据实际场景调整
  • echo -n中的回车符用于在同一行刷新进度,确保输出整洁

内容的提问来源于stack exchange,提问作者Adrian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:42:06