首页 > 解决方案 > 在保留列的同时将 Bash 输出到同一行

问题描述

好的,起初这似乎是一个基本问题,但请听我说完。它比标题看起来更复杂!

这是我想要做的目标。我想输出到类似于 Linux 引导的控制台。

Operating system is doing something...                                                 [ OK ]

现在这似乎很明显......只需使用 printf 并设置列。这是第一个问题。控制台需要先打印动作

Operating system is doing something...

然后它需要实际完成工作,然后通过 [OK] 输出到同一行继续。

这似乎再次使用 printf 很容易做到。只需完成工作(在这种情况下,调用一个函数)并返回一个条件检查,然后完成运行 printf 以输出 [ OK ] 或 [ FAIL ]。这在技术上是可行的,但我在这样做时遇到了很多并发症。这是因为该函数必须在子 shell 中调用,而我无法传递我需要的某些变量。所以 printf 出来了。

只使用 echo -n 怎么样?那应该有效吗?回显第一部分,运行函数,然后根据返回到同一行继续回显。这个解决方案的问题是我不能再保留我可以使用 printf 的列格式。

Operating system is doing something...                                             [ OK ]
Operating system is doing something else...                                             [ OK ]
Short example...                                             [ OK ]

有什么建议可以解决这些问题以获得有效的解决方案吗?谢谢

这是我尝试使用 printf 的另一种方法。这给人一种工作的错觉,但该方法实际上是有缺陷的,因为它没有给你进度指示,即函数在打印出函数正在运行之前首先运行。“嘿,我在做事”会立即打印出“嘿,我做完了”的消息。结果,它毫无意义。

VALIDATE $HOST; printf "%-50s %10s\n" " Validating and sanitizing input..." "$(if [ -z "$ERROR" ]; then echo "[$GREEN   OK   $RESET]"; else echo "[$RED  FAIL  $RESET] - $ERROR"; echo; exit; fi)"

标签: bashprintf

解决方案


没有什么特别的原因必须将所有 printf 字符串打印在一起,除非您担心您调用的某些代码会移动光标。

重新排序您的示例:

printf "%-50s " " Validating and sanitizing input..."

VALIDATE $HOST

if [ -z "$ERROR" ]; then
    printf "%10s\n" "[$GREEN   OK   $RESET]";
else
    printf "%10s\n" "[$RED  FAIL  $RESET] - $ERROR"
    echo
    exit
fi

我不知道$ERROR它包含什么或应该显示在哪里。


推荐阅读