Bash输出到同一行,同时保留列

时间:2019-02-25 06:49:55

标签: bash printf

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

这是我想要做的目标。我想输出到类似于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)"

1 个答案:

答案 0 :(得分:1)

没有特别的理由必须将所有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包含什么或应该显示在什么地方。