我使用pax
通过ssh
链接备份目录。如果想要一份进度报告,说明已经完成了多少转移。使用-v
选项,它将输出它对stderr
所做的文件名,因此我认为我可以得到目录中有多少文件的计数,并以某种方式将stderr
管道到我的shell脚本中,并报告它得到了多少。
事情是我不确定如何管道stderr
而不破坏stdout
。在远程机器上运行ksh
。
那么这就是我目前为止在远程机器上运行的内容:
file_count=$(find "$target" -type f | wc -l)
count=0
progress() {
while [ $((++count)) -lt $file_count ]; do
echo -n "$((count * 100 / file_count))%r" 1>&2
read
done
echo 100% 1>&2
}
# This line needs to be modified somehow so that
# stderr goes to progress while leaving stdout
# alone.
echo "$target" | pax -r -v | progress
似乎即使read
说它支持-n
,它不支持,所以我不能从一个特定的句柄中读取。
在Bourne shell中执行此类操作的一般方法是将标准输出临时重定向到辅助文件描述符。比如:
{ cmd 2>&1 1>&3 | progress; } 3>&1
这里,cmd
的标准输出指向原来的标准输出,而cmd
的标准输出指向progress
。在你的情况下,你应该写:
{ echo "$target" | pax -r -v 2>&1 1>&3 | progress; } 3>&1
请注意,echo
中的任何错误都不会进入到progress
的管道中(这可能很好,也可能是您想要的),并且您可能需要关注缓冲问题。还要注意$target
上的双引号。为了健壮性,您可能应该使用printf '%sn' "$target"
而不是echo
。