您可以在Bash脚本中使用GUI窗口、滑块、单选按钮、进度条等。学习如何使用zenity工具箱,并对Bash脚本进行整容。我们会教你怎么做。
Bash脚本是一种功能强大的编程语言,由于它内置在Bash shell中,因此每个人都可以随时使用它。这是一种很容易开始编程的语言。因为它是解释的,所以不需要编译脚本。一旦编辑了脚本文件并使其可执行,就可以运行它。这使得编码、运行和调试周期非常高效。
人们对Bash脚本的抱怨主要有两个,第一个是速度。因为bashshell解释脚本中的命令,所以它们的执行速度不如编译后的代码快。然而,这就像抱怨拖拉机不如汽车快;它们的用途不同。
不过,有两种速度。通常,您可以组合一个快速脚本并使用它来执行任务,这比用编译语言(如C)开发解决方案要快得多。
人们对Bash脚本的第二个抱怨是用户界面,它是一个终端窗口。当然,有时界面并不重要。如果唯一会使用脚本的人是它的作者,那么接口可能就没那么重要了。对于执行后台和批处理类型处理的脚本也不重要。通常,这样的脚本不需要太多(如果有的话)用户交互。
有时你确实需要一些比终端窗口更直观、更现代的东西。大多数人都熟悉图形用户界面(GUI)。为了给人们一种尽可能无摩擦的体验,您必须从脚本中创建和使用GUI元素。
zenity允许您在Bash脚本中合并大量的图形界面元素。它是一个强大的工具包,可以给你的脚本一个现代的感觉和一个现代的,熟悉的外观。
zenity预装在Ubuntu、Fedora和Manjaro发行版上。它是侏儒的一部分。如果您使用KDE,那么您可能希望改为签出kdialog,尽管zenity确实在任何桌面环境中运行。
本文中的示例向您展示了如何从命令行创建不同的对话框窗口,如何在变量中捕获它们的返回值和用户选择,以及如何在脚本中使用对话框窗口。
最后是一个小应用程序,它使用了所有三种类型的对话框窗口。
日历对话框窗口允许用户选择日期。要创建一个具有zenity的命令,需要两个单词:
zenity --calendar此时将显示“日历”对话框窗口。它具有标准日期选取器的所有功能。您可以更改月份和年份,然后单击某一天来选择该日期。默认情况下,今天的日期在窗口出现时高亮显示。
单击“确定”关闭对话框窗口并选择突出显示的日期。双击一个日期做同样的事情。
如果不想选择日期,请单击“取消”,按键盘上的“Esc”键,或关闭对话框窗口。
在上例中,选择2019年8月19日。如果用户单击“确定”,日历将关闭,所选日期将在终端窗口中打印。
您可以忽略行“GTKDialog mapped without a transient parent。这是不鼓励的。”
GTK代表GIMP工具箱,它是用来开发GNOME接口的工具箱。它最初是由GNU图像处理程序(GIMP)的作者设计的。GNU代表GNU不是Unix。
GTK引擎警告zenity的作者,他们以非标准的方式使用了GTK组件。
把日期打印到终端上对我们没什么用。如果要从脚本中调用此日历,则需要捕获选定的日期值,以便在脚本中使用它做一些有用的事情。我们还将稍微自定义日历。
我们将在日历中使用以下选项。它们必须与双破折号“–”标志一起使用:
我们使用一个名为ChosenDate的变量来捕获从日历返回的日期。我们使用echo$ChosenDate将日期打印到终端窗口。
是的,我们在上一个示例中获得了相同的结果,但是在这里,我们将选定的日期存储在一个变量中。在上一个示例中,它被打印并遗忘。
ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 -- month 9 --year 2019); echo $ChosenDate现在,日历显示我们的提示和窗口标题。日期设置为我们选择的开始日期,而不是今天的日期。
我们还可以自定义选择时返回的日期字符串的格式。--date format选项后面必须跟一个格式说明符。这是一个令牌字符串,用于定义要包含在输出中的数据和格式。这些标记与strftime()C语言函数中使用的标记相同,并且有大量的选择。
我们使用的代币是:
某人选择日期:
使用我们的格式返回日期。它显示一周中某一天的名称,后跟按欧洲顺序排列的日期:日、月、年。
文件选择对话框窗口相当复杂。人们可以浏览文件系统,突出显示一个或多个文件,然后单击“确定”来选择这些文件或完全取消选择。
zenity提供了所有这些功能,等等。它和日历对话框窗口一样易于使用。
我们将使用的新选项有:
“文件选择”对话框窗口的功能与其他任何文件选择窗口相同。
用户可以浏览文件系统并选择自己选择的文件。
我们已经浏览到一个新目录并选择了一个名为“button”的文件_混合.png.”
单击“确定”后,文件选择对话框窗口关闭,文件名和路径在终端窗口中打印。
如果需要在任何进一步处理中使用文件名,可以将其捕获到变量中,就像从日历中获取日期一样。
如果添加一个选项,则可以将“文件选择”对话框窗口变成“文件保存”对话框窗口。选项是--save。我们还将使用--confirm overwrite选项。这将提示用户确认要覆盖现有文件。
Resp***e=$(zenity --file-selection --save --confirm-overwrite); echo $Resp***e将显示“文件保存”对话框窗口。注意,有一个文本字段,用户可以在其中键入文件名。
用户可以浏览到文件系统中他选择的位置,提供文件名,或者单击现有文件以覆盖它。
在上面的示例中,用户突出显示了一个现有文件。
当他单击“确定”时,会出现一个确认对话框窗口,要求他确认是否要替换现有文件。注意:文件名将出现在警告对话框中。正是这种对细节的关注赋予了zenity专业的外观。
如果我们没有使用--confirm overwrite选项,文件将被自动覆盖。
文件名存储在变量响应中,该响应将打印到终端窗口。
有了zenity,在脚本中包含光滑的通知对话框窗口是很容易的。您可以调用stock对话框窗口为用户提供信息、警告、错误消息和问题。
要创建错误消息对话框窗口,请使用以下命令:
zenity --error --width 300 --text "Permission denied. Cannot write to the file."我们使用的新选项有:
错误对话框窗口以指定的宽度出现。它使用标准的GTK错误图标。
要创建信息对话框窗口,请使用以下命令:
zenity --info --width 300 --text "Update complete. Click OK to continue."我们使用的新选项是--info,它告诉zenity创建一个信息对话框窗口。
要创建问题对话框窗口,请使用以下命令:
zenity --question --width 300 --text "Are you happy to proceed?"; echo $?我们使用的新选项是--question,它告诉zenity创建一个问题对话框窗口。
美元?是一个特殊参数。它保存最近执行的前台管道的返回值。一般来说,这是最近关闭的进程的值。零值表示“确定”,一个或多个值表示“取消”
这是一种可以应用于任何zenity对话框窗口的通用技术。通过在脚本中检查此值,可以确定是否应处理或忽略从对话框窗口返回的数据。
我们单击了“是”,所以返回代码是一个零,表示“确定”
要创建警告对话框窗口,请使用以下命令:
zenity --warning --title "Low Hard Drive Space" --width 300 --text "There may not be enough hard drive space to save the backup."我们使用的新选项是--warning,它告诉zenity创建一个警告对话框窗口。
出现警告对话框窗口。这不是问题,所以只有一个按钮。
您可以使用zenity progress对话框窗口来显示一个进度条,该进度条指示脚本的完成时间。
进度条将根据从脚本传入的值进行高级处理。要演示该原理,请使用以下命令:
(for i in $(seq 0 10 100); do echo $i; sleep 1; done)命令如下所示:
我们可以使用zenity进度对话框窗口来演示进度条。注意,我们正在将上一个命令的输出管道化到zenity中:
(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close我们使用的新选项有:
此时将显示“进度”对话框窗口,条形图将向100%前进,并在每个步骤之间暂停一秒钟。
我们可以使用将值管道化到zenity的概念,在脚本中包含进度对话框窗口。
在编辑器中输入此文本并将其另存为“进度.sh.”
!/bin/bash function work-list () { echo "# First work item" echo "25" sleep 1 echo "# Second work item" echo "50" sleep 1 echo "# Third work item" echo "75" sleep 1 echo "# Last work item" echo "100" sleep 1 } work-list | zenity --progress --title "How-To Geek" --auto-close exit 0下面是剧本的细目:
使用此命令使脚本可执行:
chmod +x progress.sh使用以下命令运行脚本:
./progress.sh脚本运行,文本消息随着脚本的每个阶段的执行而改变。进度条以100%的步幅移动。
“缩放”对话框窗口允许用户移动滑块来选择数值。这意味着她不能输入太高或太低的值。
我们使用的新选项有:
这是我们正在使用的命令:
Resp***e=$(zenity --scale --title "How-To Geek" --text "Select magnification." --min-value=0 --max-value=30 --step=3 --value15); echo $Resp***e“滑块”对话框窗口出现,滑块设置为15。
用户可以移动滑块以选择新值。
当她单击“确定”时,值被传输到变量响应并打印到终端窗口。
输入对话框窗口允许用户输入文本。
我们使用的新选项有:
完整命令如下所示:
Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***e将出现一个简单的对话框窗口,其中包含一个文本输入字段。
有人可以输入和编辑文本。
当他单击“确定”时,他输入的值被分配给变量响应。我们使用echo在终端窗口中打印变量的值。
让我们把这些技术放在一起,创建一个函数脚本。脚本将执行硬件信息扫描,并在滚动文本窗口中向用户显示结果。她可以选择长扫描或短扫描类型。
对于这个脚本,我们将使用三种类型的对话框窗口,其中两种对我们来说是新的:
在编辑器中输入此文本并将其另存为“硬件”-信息.sh.”
#!/bin/bash # Display hardware listing for this computer TempFile=$(mktemp) ListType=`zenity --width=400 --height=275 --list --radiolist \ --title 'Hardware Scan' \ --text 'Select the scan type:' \ --column 'Select' \ --column 'Scan Type' TRUE "Short" FALSE "Long"` if [[ $? -eq 1 ]]; then # they pressed Cancel or closed the dialog window zenity --error --title="Scan Declined" --width=200 \ --text="Hardware scan skipped" exit 1 elif [ $ListType == "Short" ]; then # they selected the short radio button Flag="--short" else # they selected the long radio button Flag="" fi # search for hardware info with the appropriate value in $Flag hwinfo $Flag | tee >(zenity --width=200 --height=100 \ --title="Collating Information" --progress \ --pulsate --text="Checking hardware..." \ --auto-kill --auto-close) >${TempFile} # Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}" exit 0使用此命令使其可执行:
chmod +x hardware-info.sh此脚本创建一个临时文件,文件名保存在TempFile变量中:
TempFile=$(mktemp)脚本使用--list选项创建一个称为list对话框窗口的zenity对话框窗口。行尾的“\”字符告诉脚本将它们视为一条环绕的长线。过程如下:
如果用户按下“Cancel”,我们不需要检查ListType中的值,我们可以简单地退出。如果他按“确定”,我们需要知道他是选择了“短”还是“长”单选按钮:
既然脚本知道用户需要哪种类型的扫描,我们就可以执行硬件信息扫描:
当hwinfo扫描完成时,脚本调用zenity创建一个带有--text info选项的文本信息对话框窗口。文本信息对话框窗口显示TempFile文件的内容:
当用户关闭文本信息对话框窗口时,脚本退出。
exit 0我们把它点燃看看。
./hardware-info.sh将显示列表框。默认情况下选择“Short”选项。
让我们选择“Long”,然后单击“OK”
“进度”窗口将显示一个滑动指示器。在硬件扫描完成之前,它一直显示在屏幕上。
硬件扫描完成后,将显示文本信息对话框窗口,其中包含扫描的详细信息。
单击“确定”
即使是一个死硬的命令行骑师也不得不承认,几个GUI对话框窗口可以让一个不起眼的Bash脚本有一种专业的感觉。
...修补补,你会喜欢shell脚本,因为总是有调整要做。关于如何使用这些模式作为其他脚本的基础的一些想法包括: ...
...为输入运行它。这些特殊的应用程序被称为水滴。下面是如何创建一个: ...
...改其目录,您可以控制他们可以访问哪些命令。下面介绍如何在Linux上设置受限shell。 受限炮弹 受限shell不是另一个shell。这是标准外壳的另一种模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下启动。在本文中,我们将...
Bash不是唯一的Linux shell。很容易尝试其他的shell,比如非常流行的Zsh。找到一个您喜欢的shell后,使用chsh命令将其设置为默认shell。我们会教你怎么做。 为什么贝壳很重要 shell位于您和操作系统之间。它在终端窗口内提供环境...
Linux上有多种类型的环境变量。了解如何查看它们,为本地和远程登录创建它们,并使它们在重新启动后仍然有效。 环境变量的工作原理 启动终端窗口及其内部的shell时,会引用一组变量,以确保shell配置正确。这些变量还确...
...小又简单。 在使用Linux计算机的第一个小时内,您将学习如何使用Bash和其他shell附带的cd命令。也许您以前有在其他操作系统上使用它的经验,不需要解释。它会改变当前的工作目录,对吗?还有什么要知道的? 好吧,比你想象...
...只想在系统有空闲资源时运行进程,可以使用批处理。 如何安排linux作业 cron守护进程维护它在特定时间运行的作业列表。这些任务和程序按预定时间在后台运行。这为您安排需要重复的任务提供了极大的灵活性。无论您需要...