如何在另一个函数的持续时间内使用进度条/微调器? (KSH)

时间:2015-12-29 22:46:47

标签: function spinner wait ksh progress

假设我有一个有效的微调器打印输出功能,我们将调用spinfunction,然后处理一组称为myfunction

的函数的函数

使用Bash或KSH,如何在myfunction的持续时间内让这个微调器在shell的底部运行?

3 个答案:

答案 0 :(得分:3)

因为据我所知你不能使用后台函数,你要么必须从工作函数中执行微调器,要么在子shell中运行微调器并有一些方法来杀死它。

我告诉我的团队成员不要在他们的shell函数上放置进度指示器 - 它会使输出带有大量回车和微调文本,但其价值远远低于记录。它也倾向于破坏对shell程序的合理期望 - 在执行时它们可以访问标准输出和错误。旋转器不是收件箱命令行输出的标准部分是有原因的!只是我2¢

答案 1 :(得分:0)

我曾经创建了一个带有围绕全局变量$__spin的case语句的函数,类似于:

spinfunction() {
  case $__spin in
  (1) printf "\r|";  __spin=2;;
  (2) printf "\r/";  __spin=3;;
  (3) printf "\r-";  __spin=4;;
  (*) printf "\r\\"; __spin=1;;
  esac
}

这将始终打印序列中的下一个字符 当前行。如果你想把它放在固定的位置,而另一个 正在处理输出,你需要摆弄tput和很多 麻烦。

要进行测试,请附加以下内容并将脚本命名为spinner.sh

(
module=spinner
name=${0##*/}
case ${name%.sh} in
($module) 
  while sleep 0.2; do
    spinfunction
  done
;;
esac
)

使用ksh spinner.sh运行它。

答案 2 :(得分:0)

如果您不想更改myfunction并且您知道它写入日志文件, 每次将某些内容写入日志文件时,您都可以让您的spinfunction进行操作 或者你可以在一个循环(带睡眠)中调用ps,直到myfunction完成。