Упрощенная версия Вопроса
Получил этот код:
#!/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"