在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
相关产品推荐
相关产品推荐

