如何管道错误,而离开标准输出独自在ksh?



我使用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

相关内容

  • 没有找到相关文章

最新更新