Обработайте вывод команды, используя printf "что-то \ r" или echo -e "что-то" - PullRequest
0 голосов
/ 19 января 2020

Упрощенная версия Вопроса

Получил этот код:

#!/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 " $2 "
}

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"

1 Ответ

0 голосов
/ 20 января 2020

Пожалуйста, попробуйте добавить параметр -d $'\r' во встроенную функцию read, чтобы указать разделитель строк как "\r" вместо новой строки.
Затем вы можете сказать фрагмент test2 как:

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

, который даст тот же результат, что и test1.
В качестве примечания, пожалуйста, не забудьте поставить опцию -r, чтобы встроенная функция read не сбрасывала символы sh backsla независимо от этой проблемы. .
Надеюсь, это поможет.

...