使用 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
内置函数都会删除反斜杠字符。
希望这有帮助。
问题的简化版本
得到这个代码:
#!/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
内置函数都会删除反斜杠字符。
希望这有帮助。