bash 补全功能期间输出文本

bash 补全功能期间输出文本

我有一个安装了 bash 补全功能的工具。我试图完成的一个特定标志值需要对第三方程序进行外部调用,该调用速度异常缓慢。不过那也好。这一切都有效。我添加了一些本地文件缓存,因此我的工具的用户只需要每隔几天左右看到一次。

问题是速度慢似乎对用户不太友好。我不希望用户必须知道缓存是如何工作的。然而,当缓存脏时,他们必须等待大约 15 秒才能重建。我想添加一些内容来表明我们正在加载此数据。

我尝试添加一个简单的echo "Querying <third party tool>...",但有趣的是,这似乎阻止了实际出现的完成结果,直到我再次点击选项卡(大概是因为它仅回显当缓存脏时并且我第二次点击选项卡直接从缓存读取) 。我尝试让它回显到 stderr,但结果相同。

我很确定我见过其他工具在加载选项卡完成时显示加载图标。值得注意的是,gcloud在完成时显示它--project。但我还没有找到他们如何做到这一点的迹象。

答案1

这是一个小动画:

animation() {
  tput civis
  while true; do
    for i in {1..3}; do
      echo -ne "."
      sleep 1
    done
    for i in {1..3}; do
      echo -ne "\b \b"
      sleep 1
    done
  done
  tput civvis
}

kill_animation() {
  kill $anim
  echo
}

echo -n "Loading" && animation & anim=$!

sleep 10

kill_animation

结果是这样的:

在此输入图像描述

答案2

经过一番尝试后,我发现了一些可行的方法。基本上,这个想法是在您编写的文本上退格,在它们上面写入空格,然后在这些文本上退格(转义\b仅移动光标而不删除)。

我想这也是为什么 gcloud 等显示单个字符而不是文本的原因。我不想在 Bash 中为某些内容设置动画,也没有看到可以代表加载的良好单个字符,所以我所做的是:

# \e[2m = dim, \e[0m = reset
echo -ne "\e[2mLoading...\e[0m"

# do the slow thing...

# same number of `\b` and ` ` as "Loading..."
echo -ne "\b\b\b\b\b\b\b\b\b\b          \b\b\b\b\b\b\b\b\b\b"

除了代码丑陋之外,没有发现任何问题。

相关内容