以更紧凑的方式显示 wget 传输(同时保持错误检测功能)

use*_*548 3 shell-script wget

我知道 wget 有一些选项可以显示或不显示进度条。

我想以更短的方式显示 wget 传输,或者..一个百分比或一些动态的东西,但不像经典的 wget 输出那样占用太多空间,因为我必须将它插入到已经输出的脚本中。

我的目标是向用户显示正在下载文件,甚至可能是速度,但不会破坏脚本的整体外观。

重要提示:我的 wget 段落位于 if then else 脚本中,因此我必须保留错误检测功能。

我的脚本有一个看起来像的块:

if wget -O filename http://someurl then
    some_action
else
    some_other_action
fi
Run Code Online (Sandbox Code Playgroud)

有人可以为我提供一些有趣的自定义进度数据示例或具有此改进的条形吗?谢谢 ;)

meu*_*euh 5

如果您使用“点”进度输出样式,则如下所示:

   500K .......... .......... .......... .......... ..........  2%  496K 91s
Run Code Online (Sandbox Code Playgroud)

然后您可以将其(在 stderr 上)通过管道awk传输到或类似,然后打印最后 2 列中显示的“2%”字段。

wget ... --progress=dot -q --show-progress 2>&1 |
awk 'NF>2 && $(NF-2) ~ /%/{printf "\r %s",$(NF-2)} END{print "\r    "}'
Run Code Online (Sandbox Code Playgroud)

这会在一行中显示变化的百分比值,该值在最后被清除。


要保留wgetfor an的返回代码,if..else您可以通过在脚本中设置来要求 bash 使管道返回任何失败命令(而不是最右边的命令)的错误代码:

set -o pipefail
Run Code Online (Sandbox Code Playgroud)

或者,您可以将所有if..else..fi代码原封不动地放在一个块中,并将最后的 stderr 用管道传输到一个信息更丰富的 awk 中,例如 cas 在评论中所建议的:

( if wget ...
  fi
  if wget ...
  fi
  if wget ...
  fi
) 2>&1 | awk '
/^Saving to:/ { fn = gensub(/^Saving to: /,"",1) }
NF>2 && $(NF-2) ~ /%/ { printf "\r%s %s",fn,$(NF-2) }
END { gsub(/./," ",fn); print "\r    " fn }'
Run Code Online (Sandbox Code Playgroud)

或者为了避免在 stderr 上丢失重要的错误消息,只需将每个 wget 命令上的 stderr 重定向到第三个文件描述符:

( if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
  if wget ... 2>&3
  then ... else ... fi
) 3>&1 | awk ...
Run Code Online (Sandbox Code Playgroud)