如何向linux shell脚本添加gui

您可以在Bash脚本中使用GUI窗口、滑块、单选按钮、进度条等。学习如何使用zenity工具箱,并对Bash脚本进行整容。我们会教你怎么做。...

如何向linux shell脚本添加gui

您可以在Bash脚本中使用GUI窗口、滑块、单选按钮、进度条等。学习如何使用zenity工具箱,并对Bash脚本进行整容。我们会教你怎么做。

Bash脚本是一种功能强大的编程语言,由于它内置在Bash shell中,因此每个人都可以随时使用它。这是一种很容易开始编程的语言。因为它是解释的,所以不需要编译脚本。一旦编辑了脚本文件并使其可执行,就可以运行它。这使得编码、运行和调试周期非常高效。

人们对Bash脚本的抱怨主要有两个,第一个是速度。因为bashshell解释脚本中的命令,所以它们的执行速度不如编译后的代码快。然而,这就像抱怨拖拉机不如汽车快;它们的用途不同。

不过,有两种速度。通常,您可以组合一个快速脚本并使用它来执行任务,这比用编译语言(如C)开发解决方案要快得多。

人们对Bash脚本的第二个抱怨是用户界面,它是一个终端窗口。当然,有时界面并不重要。如果唯一会使用脚本的人是它的作者,那么接口可能就没那么重要了。对于执行后台和批处理类型处理的脚本也不重要。通常,这样的脚本不需要太多(如果有的话)用户交互。

有时你确实需要一些比终端窗口更直观、更现代的东西。大多数人都熟悉图形用户界面(GUI)。为了给人们一种尽可能无摩擦的体验,您必须从脚本中创建和使用GUI元素。

zenity应用程序

zenity允许您在Bash脚本中合并大量的图形界面元素。它是一个强大的工具包,可以给你的脚本一个现代的感觉和一个现代的,熟悉的外观。

zenity预装在Ubuntu、Fedora和Manjaro发行版上。它是侏儒的一部分。如果您使用KDE,那么您可能希望改为签出kdialog,尽管zenity确实在任何桌面环境中运行。

本文中的示例向您展示了如何从命令行创建不同的对话框窗口,如何在变量中捕获它们的返回值和用户选择,以及如何在脚本中使用对话框窗口。

最后是一个小应用程序,它使用了所有三种类型的对话框窗口。

日历对话框窗口

日历对话框窗口允许用户选择日期。要创建一个具有zenity的命令,需要两个单词:

zenity --calendar007Ys3FFgy1gp66kfvoj8j30hy01lt8k

此时将显示“日历”对话框窗口。它具有标准日期选取器的所有功能。您可以更改月份和年份,然后单击某一天来选择该日期。默认情况下,今天的日期在窗口出现时高亮显示。

如何向linux shell脚本添加gui

单击“确定”关闭对话框窗口并选择突出显示的日期。双击一个日期做同样的事情。

如果不想选择日期,请单击“取消”,按键盘上的“Esc”键,或关闭对话框窗口。

如何向linux shell脚本添加gui

在上例中,选择2019年8月19日。如果用户单击“确定”,日历将关闭,所选日期将在终端窗口中打印。

如何向linux shell脚本添加gui

您可以忽略行“GTKDialog mapped without a transient parent。这是不鼓励的。”

GTK代表GIMP工具箱,它是用来开发GNOME接口的工具箱。它最初是由GNU图像处理程序(GIMP)的作者设计的。GNU代表GNU不是Unix。

GTK引擎警告zenity的作者,他们以非标准的方式使用了GTK组件。

捕获日期值

把日期打印到终端上对我们没什么用。如果要从脚本中调用此日历,则需要捕获选定的日期值,以便在脚本中使用它做一些有用的事情。我们还将稍微自定义日历。

我们将在日历中使用以下选项。它们必须与双破折号“–”标志一起使用:

  • –text:指定要在日历中显示的文本字符串。它将替换默认值“从下面选择日期”
  • –title:设置日历对话框窗口的标题。
  • –day:设置日历打开时选择的日期。
  • –month:设置日历打开时选择的月份。
  • –year:设置日历打开时选择的年份。

我们使用一个名为ChosenDate的变量来捕获从日历返回的日期。我们使用echo$ChosenDate将日期打印到终端窗口。

是的,我们在上一个示例中获得了相同的结果,但是在这里,我们将选定的日期存储在一个变量中。在上一个示例中,它被打印并遗忘。

ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --day 1 -- month 9 --year 2019); echo $ChosenDate

如何向linux shell脚本添加gui

现在,日历显示我们的提示和窗口标题。日期设置为我们选择的开始日期,而不是今天的日期。

如何向linux shell脚本添加gui

我们还可以自定义选择时返回的日期字符串的格式。--date format选项后面必须跟一个格式说明符。这是一个令牌字符串,用于定义要包含在输出中的数据和格式。这些标记与strftime()C语言函数中使用的标记相同,并且有大量的选择。

我们使用的代币是:

  • %A:一周中某一天的全称。
  • %d:以数字表示的一个月的哪一天。
  • %m:以数字表示的月份。
  • %年是两位数(没有世纪)。
ChosenDate=$(zenity -- calendar --text "Choose a date" --title "How-To Geek Rota" --date-format="%A %d/%m/%y" --day 1 -- month 9 --year 2019); echo $ChosenDate

如何向linux shell脚本添加gui

某人选择日期:

如何向linux shell脚本添加gui

使用我们的格式返回日期。它显示一周中某一天的名称,后跟按欧洲顺序排列的日期:日、月、年。

如何向linux shell脚本添加gui

文件选择对话框窗口:选择文件

文件选择对话框窗口相当复杂。人们可以浏览文件系统,突出显示一个或多个文件,然后单击“确定”来选择这些文件或完全取消选择。

zenity提供了所有这些功能,等等。它和日历对话框窗口一样易于使用。

我们将使用的新选项有:

  • –文件选择:告诉zenity我们要使用文件选择对话框窗口。
  • –多个:允许用户选择多个文件。
  • –文件过滤器:告诉文件对话框窗口要显示的文件类型。
zenity --file-selection --tile "How-To Geek" --multiple --file-filter='*.mm *.png *.page *.sh *.txt'

如何向linux shell脚本添加gui

“文件选择”对话框窗口的功能与其他任何文件选择窗口相同。

如何向linux shell脚本添加gui

用户可以浏览文件系统并选择自己选择的文件。

如何向linux shell脚本添加gui

我们已经浏览到一个新目录并选择了一个名为“button”的文件_混合.png.”

单击“确定”后,文件选择对话框窗口关闭,文件名和路径在终端窗口中打印。

如何向linux shell脚本添加gui

如果需要在任何进一步处理中使用文件名,可以将其捕获到变量中,就像从日历中获取日期一样。

文件选择对话框窗口:保存文件

如果添加一个选项,则可以将“文件选择”对话框窗口变成“文件保存”对话框窗口。选项是--save。我们还将使用--confirm overwrite选项。这将提示用户确认要覆盖现有文件。

Resp***e=$(zenity --file-selection --save --confirm-overwrite); echo $Resp***e

如何向linux shell脚本添加gui

将显示“文件保存”对话框窗口。注意,有一个文本字段,用户可以在其中键入文件名。

如何向linux shell脚本添加gui

用户可以浏览到文件系统中他选择的位置,提供文件名,或者单击现有文件以覆盖它。

如何向linux shell脚本添加gui

在上面的示例中,用户突出显示了一个现有文件。

当他单击“确定”时,会出现一个确认对话框窗口,要求他确认是否要替换现有文件。注意:文件名将出现在警告对话框中。正是这种对细节的关注赋予了zenity专业的外观。

如果我们没有使用--confirm overwrite选项,文件将被自动覆盖。

如何向linux shell脚本添加gui

文件名存储在变量响应中,该响应将打印到终端窗口。

如何向linux shell脚本添加gui

通知对话框窗口

有了zenity,在脚本中包含光滑的通知对话框窗口是很容易的。您可以调用stock对话框窗口为用户提供信息、警告、错误消息和问题。

要创建错误消息对话框窗口,请使用以下命令:

zenity --error --width 300 --text "Permission denied. Cannot write to the file."

我们使用的新选项有:

  • –错误:告诉zenity我们要使用错误对话框窗口。
  • –宽度:设置窗口的初始宽度。

如何向linux shell脚本添加gui

错误对话框窗口以指定的宽度出现。它使用标准的GTK错误图标。

如何向linux shell脚本添加gui

要创建信息对话框窗口,请使用以下命令:

zenity --info --width 300 --text "Update complete. Click OK to continue."

我们使用的新选项是--info,它告诉zenity创建一个信息对话框窗口。

如何向linux shell脚本添加gui

要创建问题对话框窗口,请使用以下命令:

zenity --question --width 300 --text "Are you happy to proceed?"; echo $?

我们使用的新选项是--question,它告诉zenity创建一个问题对话框窗口。

如何向linux shell脚本添加gui

美元?是一个特殊参数。它保存最近执行的前台管道的返回值。一般来说,这是最近关闭的进程的值。零值表示“确定”,一个或多个值表示“取消”

这是一种可以应用于任何zenity对话框窗口的通用技术。通过在脚本中检查此值,可以确定是否应处理或忽略从对话框窗口返回的数据。

如何向linux shell脚本添加gui

我们单击了“是”,所以返回代码是一个零,表示“确定”

如何向linux shell脚本添加gui

要创建警告对话框窗口,请使用以下命令:

zenity --warning --title "Low Hard Drive Space" --width 300 --text "There may not be enough hard drive space to save the backup."

我们使用的新选项是--warning,它告诉zenity创建一个警告对话框窗口。

如何向linux shell脚本添加gui

出现警告对话框窗口。这不是问题,所以只有一个按钮。

如何向linux shell脚本添加gui

“进度”对话框窗口

您可以使用zenity progress对话框窗口来显示一个进度条,该进度条指示脚本的完成时间。

进度条将根据从脚本传入的值进行高级处理。要演示该原理,请使用以下命令:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done)

如何向linux shell脚本添加gui

命令如下所示:

  • seq命令以10步为单位逐步执行从0到100的序列。
  • 在每个步骤中,值都存储在变量i中。这将打印到终端窗口。
  • 由于sleep 1命令,该命令暂停一秒钟。

我们可以使用zenity进度对话框窗口来演示进度条。注意,我们正在将上一个命令的输出管道化到zenity中:

(for i in $(seq 0 10 100); do echo $i; sleep 1; done) | zenity --progress --title "How-To Geek" -- auto-close

如何向linux shell脚本添加gui

我们使用的新选项有:

  • –progress:告诉zenity我们要使用进度对话框窗口。
  • –自动关闭:当进度条达到100%时关闭对话框。

此时将显示“进度”对话框窗口,条形图将向100%前进,并在每个步骤之间暂停一秒钟。

如何向linux shell脚本添加gui

我们可以使用将值管道化到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

下面是剧本的细目:

  • 这个脚本定义了一个名为worklist的函数。这是你把你的命令和指示,以执行真正的工作。将每个sleep 1命令替换为真实的命令。
  • zenity接受回显“#…”行,并在进度对话框窗口中显示它们。更改这些行的文本,以便它们向用户传递信息性消息。
  • 包含数字的回显行(如回显“25”)也被zenity接受并设置进度条的值。
  • 工作列表函数被调用并通过管道传输到zenity。

使用此命令使脚本可执行:

chmod +x progress.sh

如何向linux shell脚本添加gui

使用以下命令运行脚本:

./progress.sh

如何向linux shell脚本添加gui

脚本运行,文本消息随着脚本的每个阶段的执行而改变。进度条以100%的步幅移动。

如何向linux shell脚本添加gui

缩放对话框窗口

“缩放”对话框窗口允许用户移动滑块来选择数值。这意味着她不能输入太高或太低的值。

我们使用的新选项有:

  • –scale:告诉zenity我们要使用一个scale对话框窗口。
  • –最小值:设置刻度的最小值。
  • –最大值:设置刻度的最大值。
  • –步骤:设置使用箭头键时滑块的移动量。如果有人使用鼠标,这不会影响滑块的移动。
  • –value:设置滑块的初始值和位置。

这是我们正在使用的命令:

Resp***e=$(zenity --scale --title "How-To Geek" --text "Select magnification." --min-value=0 --max-value=30 --step=3 --value15); echo $Resp***e

如何向linux shell脚本添加gui

“滑块”对话框窗口出现,滑块设置为15。

如何向linux shell脚本添加gui

用户可以移动滑块以选择新值。

如何向linux shell脚本添加gui

当她单击“确定”时,值被传输到变量响应并打印到终端窗口。

如何向linux shell脚本添加gui

输入对话框窗口

输入对话框窗口允许用户输入文本。

我们使用的新选项有:

  • –entry:告诉zenity我们要使用一个entry对话框窗口。
  • –输入文本:如果要在文本输入字段中键入建议值,可以使用此选项。我们用“”强制一个空字段。这不是严格要求的,但是我们想记录下这个选项。

完整命令如下所示:

Resp***e=$(zenity --entry --text "Enter your search term" --title "Howe-To Geek" --entry-text=""); echo $Resp***e

如何向linux shell脚本添加gui

将出现一个简单的对话框窗口,其中包含一个文本输入字段。

如何向linux shell脚本添加gui

有人可以输入和编辑文本。

如何向linux shell脚本添加gui

当他单击“确定”时,他输入的值被分配给变量响应。我们使用echo在终端窗口中打印变量的值。

如何向linux shell脚本添加gui

把它们放在一起

让我们把这些技术放在一起,创建一个函数脚本。脚本将执行硬件信息扫描,并在滚动文本窗口中向用户显示结果。她可以选择长扫描或短扫描类型。

对于这个脚本,我们将使用三种类型的对话框窗口,其中两种对我们来说是新的:

  • 第一个是列表对话框窗口。它允许人们做出选择。
  • 第二个是一个进度对话框窗口,让用户知道发生了什么,她应该等待。
  • 第三个是文本信息窗口,向用户显示结果。

在编辑器中输入此文本并将其另存为“硬件”-信息.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

如何向linux shell脚本添加gui

此脚本创建一个临时文件,文件名保存在TempFile变量中:

TempFile=$(mktemp)

脚本使用--list选项创建一个称为list对话框窗口的zenity对话框窗口。行尾的“\”字符告诉脚本将它们视为一条环绕的长线。过程如下:

  • 我们指定窗口的宽度和高度。
  • 列表对话框窗口支持列。--radiolist选项使第一列成为单选按钮列。
  • 我们为窗口设置标题和文本提示。
  • 我们将第一列的标题设置为“选择”。此列的内容将是单选按钮。
  • 我们将第二列的标题设置为“Select”,并提供第二列的内容。此列包含两个文本标签:“Short”和“Long”。TRUE和FALSE指示符表示在出现对话框窗口时默认选中“Short”选项。
  • 我们将这个对话框窗口的结果存储在一个名为ListType的变量中。
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"`

如果用户按下“Cancel”,我们不需要检查ListType中的值,我们可以简单地退出。如果他按“确定”,我们需要知道他是选择了“短”还是“长”单选按钮:

  • 特殊参数$?如果用户按“确定”,则等于零;如果用户按“取消”或关闭窗口,则等于1。
  • 如果它等于1,脚本将显示一个错误信息对话框窗口并退出。如果他按“OK”,我们将继续测试ListType变量中的值。
  • 如果ListType变量的值为“Short”,则脚本会将名为Flag的变量设置为等于“–Short”
  • 如果ListType变量不包含值“Short”,则必须包含值“Long”。脚本将名为Flag的变量设置为等于“”,这是一个空字符串。
  • 脚本将在下一节中使用Flag变量。
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

既然脚本知道用户需要哪种类型的扫描,我们就可以执行硬件信息扫描:

  • 脚本调用hwinfo命令并将Flag变量中的值传递给它。
  • 如果标志包含“-short”,hwinfo命令将执行短扫描。如果Flag的值为“”,则不向hwinfo传递任何信息,并且执行默认的长扫描。
  • 该脚本将hwinfo的输出通过管道传输到tee中。tee将输出发送到zenity和TempFile中。
  • 脚本将创建一个进度条对话框窗口。它设置对话框窗口的宽度和高度,以及标题和提示文本。
  • 脚本无法预先知道hwinfo命令将产生多少信息,因此无法将进度条正确设置为100%。--pulsate选项使“进度”对话框显示移动指示器。这会通知用户发生了什么,他应该等待。
  • 如果有人单击“取消”,则--auto kill选项将终止脚本
  • --auto-close选项使进度对话框在其监视的进程完成时自动关闭。
# 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}

当hwinfo扫描完成时,脚本调用zenity创建一个带有--text info选项的文本信息对话框窗口。文本信息对话框窗口显示TempFile文件的内容:

  • 脚本设置对话框窗口的宽度和高度以及标题文本。
  • --flename选项用于读取TempFIle变量中保存的文件的内容。
# Display the hardware info in a scrolling window zenity --width=800 --height=600 \ --title "Hardware Details" \ --text-info --filename="${TempFile}"

当用户关闭文本信息对话框窗口时,脚本退出。

exit 0

我们把它点燃看看。

./hardware-info.sh

如何向linux shell脚本添加gui

将显示列表框。默认情况下选择“Short”选项。

如何向linux shell脚本添加gui

让我们选择“Long”,然后单击“OK”

如何向linux shell脚本添加gui

“进度”窗口将显示一个滑动指示器。在硬件扫描完成之前,它一直显示在屏幕上。

如何向linux shell脚本添加gui

硬件扫描完成后,将显示文本信息对话框窗口,其中包含扫描的详细信息。

如何向linux shell脚本添加gui

单击“确定”

即使是一个死硬的命令行骑师也不得不承认,几个GUI对话框窗口可以让一个不起眼的Bash脚本有一种专业的感觉。

 

  • 发表于 2021-04-03 07:01
  • 阅读 ( 289 )
  • 分类:互联网

你可能感兴趣的文章

使用简单的shell脚本修复html格式

...修补补,你会喜欢shell脚本,因为总是有调整要做。关于如何使用这些模式作为其他脚本的基础的一些想法包括: ...

  • 发布于 2021-03-13 00:12
  • 阅读 ( 234 )

什么是shell脚本,为什么要使用它

... 如何执行shell脚本?很简单。只需将脚本路径作为参数传递给shell: ...

  • 发布于 2021-03-13 04:53
  • 阅读 ( 246 )

如何使用applescript将bash脚本转换为可单击的应用程序

...为输入运行它。这些特殊的应用程序被称为水滴。下面是如何创建一个: ...

  • 发布于 2021-03-21 09:39
  • 阅读 ( 245 )

在linux中,“bash”是什么意思?

...在这篇短文中,我们将探讨Bash是什么,它做什么,以及如何开始使用它。 ...

  • 发布于 2021-03-28 13:14
  • 阅读 ( 449 )

哪个linux shell最好?比较了5种常见的贝壳

...你的计算机需要一个翻译层。这介于你告诉它做什么和它如何理解之间。 ...

  • 发布于 2021-03-30 18:45
  • 阅读 ( 366 )

如何使用受限shell来限制linux用户可以做什么

...改其目录,您可以控制他们可以访问哪些命令。下面介绍如何在Linux上设置受限shell。 受限炮弹 受限shell不是另一个shell。这是标准外壳的另一种模式。Bash、Korn、Fish和其他shell都可以在受限shell模式下启动。在本文中,我们将...

  • 发布于 2021-03-31 10:57
  • 阅读 ( 383 )

如何使用chsh在linux上更改默认shell

Bash不是唯一的Linux shell。很容易尝试其他的shell,比如非常流行的Zsh。找到一个您喜欢的shell后,使用chsh命令将其设置为默认shell。我们会教你怎么做。 为什么贝壳很重要 shell位于您和操作系统之间。它在终端窗口内提供环境...

  • 发布于 2021-04-02 06:04
  • 阅读 ( 334 )

如何在linux上的bash中设置环境变量

Linux上有多种类型的环境变量。了解如何查看它们,为本地和远程登录创建它们,并使它们在重新启动后仍然有效。 环境变量的工作原理 启动终端窗口及其内部的shell时,会引用一组变量,以确保shell配置正确。这些变量还确...

  • 发布于 2021-04-02 06:44
  • 阅读 ( 218 )

如何在linux上使用cd命令

...小又简单。 在使用Linux计算机的第一个小时内,您将学习如何使用Bash和其他shell附带的cd命令。也许您以前有在其他操作系统上使用它的经验,不需要解释。它会改变当前的工作目录,对吗?还有什么要知道的? 好吧,比你想象...

  • 发布于 2021-04-02 08:58
  • 阅读 ( 171 )

如何在linux上使用at和batch来调度命令

...只想在系统有空闲资源时运行进程,可以使用批处理。 如何安排linux作业 cron守护进程维护它在特定时间运行的作业列表。这些任务和程序按预定时间在后台运行。这为您安排需要重复的任务提供了极大的灵活性。无论您需要...

  • 发布于 2021-04-02 18:33
  • 阅读 ( 184 )
m27674624
m27674624

0 篇文章

相关推荐