Linux 进度条+;ETA与pv命令在同一行 简介

Linux 进度条+;ETA与pv命令在同一行 简介,linux,bash,macos,shell,pv,Linux,Bash,Macos,Shell,Pv,我在管道中使用pv命令来显示进度条。我用一个简单的计数器试过: for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | pv --progress --line-mode --size 100 --eta --timer for((i=1;i您键入了错误的命令 for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | >&2 echo

我在管道中使用
pv
命令来显示进度条。我用一个简单的计数器试过:

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | pv --progress --line-mode --size 100 --eta --timer

for((i=1;i您键入了错误的命令

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | >&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer
                                                                               ^
为什么第一个命令不是这样?这是因为整个
for do done
子句被视为一个单独的命令,因此其结果被正确地传输到
pv
。但是,在第二个命令中,结果被传输到
echo
。您知道,
echo
不会从stdin读取任何内容

由于
pv
将stdin定向到stdout,因此数字也会输出到终端,这与stderr的指示混淆。要抑制nornal输出,请将其重定向到
/dev/null
,因此最后的命令是

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | (>&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer) > /dev/null
for((i=1;i&2 echo-en“\r”pv—进度—线路模式—大小100—eta—计时器)>/dev/null

如果要将输出重定向到文件,只需在命令末尾更改
/dev/null

我不确定我是否完全理解您的意思,但我在命令行上尝试了这一点,现在它再次在新行上更新进度(如我的第一个示例).缺少了一点必要的东西吗?@RolfW.我注意到我在
echo;pv
周围加了一对括号,但我现在看到我的评论不清楚;我真正的意思是我不完全理解你解释的背后的原理,所以在你提出建议后我自己无法正确理解。当我以-I-I的身份尝试你的例子时s、 它,就像我问题中的第一个代码示例。我想要的是进度条+百分比+ETA在同一行上更新。你知道如何使代码像这样工作吗?就是这样:)谢谢!对于任何感兴趣的人,我还有一个要求,就是将标准输出写入管道末尾的文件:
((i=1;i&2 echo-en“\r”pv——进度——线路模式——大小100——eta——计时器>/dev/null)>temp.txt
。此解决方案抑制标准输出,因此需要一种解决方法:
for((i=1;i>temp.txt;echo“$1”完成)(>&2 echo-en“\r”pv——进度——线路模式——大小100——eta——计时器>/dev/null)
for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | (>&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer)
for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | (>&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer) > /dev/null