在 Bash 中创建进度条
进度条是显示任务进度的视觉指示器,例如长时间运行的脚本或命令。 它可以用于向用户提供有关任务状态的反馈,还可以帮助估计任务完成之前的剩余时间。
本文将探讨在 Bash(Linux 和 macOS 的默认 shell)中向 shell 脚本添加进度条的几种方法。
使用 pv 命令在 Bash 中创建进度条
向 shell 脚本添加进度条的最简单方法之一是使用 pv 命令,它代表管道查看器。 此命令允许监视通过管道传递的数据的进度,可用于在终端中显示进度条。
例如,要向将大文件从一个位置复制到另一个位置的脚本添加进度条,可以使用以下命令:
cat file.txt | pv -s $(stat -c%s file.txt) > /destination/file.txt
此命令使用 cat
读取 file.txt 文件的内容并将输出通过管道传递给 pv 命令。 pv
命令使用 -s 选项以字节为单位指定输入数据大小,并根据此值计算进度。
pv
命令的输出随后被重定向到目标文件。
当脚本运行时,pv 命令将在终端中显示一个进度条,显示复制文件的百分比以及任务完成前的估计剩余时间。 进度条会随着数据的传输而动态更新,并在任务完成时消失。
使用对话框命令在 Bash 中创建进度条
将进度条添加到 shell 脚本的另一种方法是使用 dialog 命令,这是一种在终端中创建用户友好界面的实用程序。 对话框命令可以显示各种小部件,包括进度条,并且可以通过脚本控制它以显示任务的当前进度。
要使用 dialog 命令向 shell 脚本添加进度条,您可以使用 --gauge 选项创建一个新的进度条小部件。 --gauge 选项有几个参数,包括小部件的标题、小部件的高度和宽度以及进度条的初始值。
以下是如何使用 --gauge 选项创建标题为正在复制文件且初始值为 0 的进度条的示例:
dialog --gauge "Copying file" 10 70 0
此命令将创建一个高度为 10 行、宽度为 70 个字符的进度条小部件,并将在小部件顶部显示标题正在复制文件。 进度条最初为空,值为 0。
要更新任务的进度和进度条的值,可以使用 --title 选项设置小部件的标题,使用 --gauge-data 选项设置进度条的当前值。 例如,要更新进度条以显示完成 50%,您可以使用以下命令:
dialog --title "Copying file" --gauge-data 50
此命令会将小部件的标题更新为正在复制文件,并将进度条的值更新为 50。进度条将使用新值重新绘制,用户将在终端中看到更新后的任务进度。
要在 shell 脚本中使用对话命令,您可以使用 --and-widget 选项指定应按顺序执行的小部件命令列表。 这允许您在脚本中创建和更新进度条,并将确保以正确的顺序绘制和更新小部件。
以下是使用 dialog 命令创建和更新进度条的 shell 脚本示例:
#!/bin/bash
# Create the progress bar widget
dialog --gauge "Copying file" 10 70 0
使用 ncurses 库在 Bash 中创建进度条
将进度条添加到 shell 脚本的另一种方法是使用 ncurses 库,这是一个用于在终端中创建用户友好界面的编程库。 ncurses 库提供了许多用于创建交互式菜单、表单和其他图形用户界面的函数和小部件,它可用于在 shell 脚本中创建自定义进度条。
要使用ncurses 库在shell 脚本中添加进度条,可以使用initscr 函数初始化屏幕,使用newwin 函数为进度条创建一个新窗口。 newwin 函数有几个参数,包括窗口的高度和宽度以及窗口在屏幕上的初始位置。
下面举例说明如何使用newwin函数在屏幕上的(5,5)位置创建一个高度为10行、宽度为70个字符的进度条窗口:
#!/bin/bash
# Initialize the screen
initscr
# Create the progress bar window
win=`newwin 10 70 5 5`
此代码将初始化屏幕并为进度条创建一个新窗口。 win 变量将引用窗口,该窗口可用于访问和更新脚本中的进度条。
绘制进度条的初始状态,可以使用box函数在窗口周围画一个框,mvwaddstr 函数在框内写上进度条的标题和0%的初始值。
以下是如何使用这些函数绘制进度条初始状态的示例:
# Draw the box around the window
box $win 0 0
# Write the title and initial value of the progress bar
mvwaddstr $win 1 1 "Copying file"
mvwaddstr $win 1 30 "0%"
要更新任务的进度和进度条的值,可以再次使用 mvwaddstr 函数将进度条的新值写入框内。 例如,要更新进度条以显示完成 50%,您可以使用以下代码:
# Update the value of the progress bar
mvwaddstr $win 1 30 "50%"
此代码将用新值 50% 覆盖进度条的现有值。 进度条将使用新值重新绘制,用户将在终端中看到更新后的任务进度。
相关文章
在 Bash 中运行 find -exec 命令
发布时间:2024/03/14 浏览次数:127 分类:操作系统
-
本文将演示如何使用 find 命令的 -exec 参数来使用 find 命令定位文件中的任何文本。