bash printf - 如何在不删除先前输出的情况下将文本右对齐

bash printf - how to align text to right in the same line without deleting previous output

我正在尝试让脚本中的 DoneFail 状态与先前文本的右侧对齐。但不是例如从最后一个字符起 50 个字符,但从终端左侧起 50 个字符。我不是使用单个打印它,而是使用多个 printf。在我的代码中,例如

    printf "Creating folder..."
    sleep 2
    mkdir foo
    printf "\r%50.10s\n" "Done"

不幸的是它一直在输出

                                                  Done

而不是

    Creating folder...                            Done

是否可以在不删除先前输出的情况下将同一行中的文本右对齐?

Debian 8,bash4.3.30

至少有几个选项。

  1. 简单地扩展已经输出的内容:

    printf "Creating folder..."
    mkdir foo
    sleep 2
    printf "%32s\n" "Done"
    
  2. 重写已经输出的内容:

    printf "Creating folder..."
    mkdir foo
    sleep 2
    printf "\r%-50s %s\n" "Creating folder..." "Done"
    

我将 sleep 移到了 mkdir 之后,让您有机会在 printf 再次启动之前阅读来自 mkdir 的错误消息。

您可能还想考虑在邮件中显示文件夹名称。

您可以使用 ANSI 转义码将光标明确定位在第 50 列中:

printf "Creating folder..."
sleep 2
mkdir foo
printf "3[50G%s\n" "Done"
        ^^^^^^^^

这不需要根据已打印的量计算宽度或重新打印行的第一部分。不过,它确实假设有一个处理 ANSI 转义码的终端。