原地更新終端輸出信息

前言

有時咱們須要更新同一行輸出信息,而不是輸出新行,如進度顯示。兩種實現方法:bash

  1. 輸出退格符\b,清除該行輸入字符
  2. 輸出回車符\r,而後覆蓋已輸出的字符

對於第1種實現,該行已輸出多少字符,須要恰好輸出相同數量\b,以防止某些終端實現把上一行的回車也吃掉了。可以使用printf()的返回值獲得已輸出字符數。命令行

對於第2種實現,輸出的新字符數量必須很多於已輸出的,以徹底覆蓋以前的輸出。3d

本人更傾向於第2種實現,只要保證每行輸出的字符數量相同(經過printf()指定參數的輸出字符數),實現更簡潔、維護性更好。code

本文分別給出C語言和Shell的實現例子。io

C語言實現

c#include <stdio.h>
#include <unistd.h>

int main(void) 
{
    int i;

    for (i = 0; i < 100; i++) {
        printf("\rprogress: %3d %%", i);
        fflush(stdout);
        sleep(1);
    }

    printf("\n");
    return 0;
}

須要特別注意的是,終端設備是行緩衝設備,即除非輸出換行符\n或緩衝區已滿,不然printf()不會有任何輸出;因此這裏須要使用fflush(stdout)清除標準輸出緩衝區,以當即輸出緩衝區內容。終端

Shell實現

bash#!/bin/bash

for i in {1..100}
do
    printf "\rprocess %3d %%" $i
    sleep 1
done

# print a new line
echo

腳本中可以使用printf命令行程序。程序

相關文章
相關標籤/搜索