使用 printf "something\r" 或 echo -e "something" 处理命令的输出

Process the output of a command using printf "something\r" or echo -e "something"

问题的简化版本

得到这个代码:

#!/bin/bash

test1 ()
{
    for i in {1..10} ; do

        sleep 0.03

        printf  "asdfasd $i asdfasd asdfdfdsa \n"
    done
}

test2 ()
{
    for i in {1..10} ; do

        sleep 0.03

        printf  "asdfasd $i asdfasd asdfdfdsa \r"
    done
}

processing ()
{
    printf "  "
}

test1 |\
    while read k;
    do
        processing $k
    done
    printf "_test1_ \n"

test2 |\
    while read k;
    do
        echo $k
        processing $k
    done
    printf "_test2_ \n

输出:

 1  2  3  4  5  6  7  8  9  10 _test1_
_test2_

如何读取(处理)test2 的输出,使其与 test1 的输出一样?

原题

我想处理命令中的所有打印件:

rsync -au --info=progress2 $HOME/test/data $HOME/test/output

类似于:

 1,390 1% x.23MB/s 0:00:00 (xfr#61, ir-chk=x/1101)
 1,505 2% x.32MB/s 0:00:00 (xfr#62, ir-chk=x/1103)
 1,181 3% x.40MB/s 0:00:00 (xfr#63, ir-chk=x/1109)
 1,773 3% x.59MB/s 0:00:00 (xfr#64, ir-chk=x/1109)
 1,366 4% x.78MB/s 0:00:00 (xfr#65, ir-chk=x/1109)

相反,我得到(只有一行)

0 0% 0.00kB/s 0:00:00 (xfr#0, ir-chk=1047/1050)

我想该命令使用 printf "... \r"echo -e "..."

(最终目标是获取总百分比并在进度条通知中输出) PD:在疯狂的尝试中,我就在这一点上。

#...
pb ()
{
    A=${3::-1}
    CAM=$(($A / 4))
    EAM=$((25 - $CAM ))
    c="─────────────────────────"
    s="                         "
    barra_progreso="${c:0:$CAM} ${s:0:$EAM}"

    dunstify -t 150 -r 2593 -u normal "backup $barra_progreso"
}

stdbuf -o0 rsync -au --info=progress2 $HOME/test/data $HOME/test/output |\
    while read k;
    do
        pb $k
    done

dunstify  -C 2593

代码说明

$A -> Number from 0 to 100
if A == 0
$barra_progreso -> "                         "
--------
if A == 20
$barra_progreso -> "────                     "
--------
if A == 100
$barra_progreso -> "─────────────────────────"
--------
In my theory its posible make this change and get the output in shell-stdout

    dunstify -t 150 -r 2593 -u normal "backup $barra_progreso"
this
    printf "backup $barra_progreso\r"

请尝试将 -d $'\r' 选项添加到 read 内置 将行分隔符指定为 "\r" 而不是换行符。
然后你可以说 test2 片段为:

test2 |\
    while read -r -d $'\r' k;
    do
        processing $k
    done
    printf "_test2_ \n"

这将产生与 test1 相同的结果。
作为旁注,请记住放置 -r 选项以防止 不管这个问题如何,read 内置函数都会删除反斜杠字符。
希望这有帮助。