有些误解认为 shell 脚本仅用于 cli 环境。实际上在 kde 或 gnome 桌面下,你可以有效的使用各种工具编写 gui 或者网络(socket)脚本。shell 脚本可以使用一些 gui 组件(菜单、警告框、进度条等),你可以控制终端输出、光标位置以及各种输出效果等等。利用下面的工具,你可以构建强壮的、可交互的、对用户友好的 unix/linux bash 脚本。
制作 gui 应用不是一项困难的任务,但需要时间和耐心。幸运的是,unix 和 linux 都带有大量编写漂亮 gui 脚本的工具。以下工具是基于 freebsd 和 linux 操作系统做的测试,而且也适用于其他类 unix 操作系统。
1、notify-send 命令
notify-send 命令允许你借助通知守护进程发送桌面通知给用户。这种避免打扰用户的方式,对于通知桌面用户一个事件或显示一些信息是有用的。在 debian 或 ubuntu 上,你需要使用 apt 命令 或 apt-get 命令 安装的包:
sudo apt-get install libnotify-bin
centos/rhel 用户使用下面的 yum 命令:
sudo yum install libnotify
fedora linux 用户使用下面的 dnf 命令:
`$ sudo dnf install libnotify`
in this example, send simple desktop notification from the command line, enter:
### 发送一些通知 ###
notify-send rsnapshot done :)
示例输出:
notify-send: shell script get or send desktop notifications
下面是另一个附加选项的代码:
...
alert=18000
live=$(lynx --dump http://money.rediff.com/ | grep 'bse live' | awk '{ print $5}' | sed 's/,//g;s/.[0-9]*//g')
[ $notify_counter -eq 0 ] && [ $live -ge $alert ] && { notify-send -t 5000 -u low -i bse sensex touched 18k; notify_counter=1; }
...
示例输出:
linux / unix: display notifications from your shell scripts with notify-send
这里:
-t 5000:指定超时时间(毫秒) (5000 毫秒 = 5 秒)
-u low: 设置紧急等级 (如:低、普通、紧急)
-i gtk-dialog-info: 设置要显示的图标名称或者指定的图标(你可以设置路径为:-i /path/to/your-icon.png)
关于更多使用notify-send功能的信息,请参考 man 手册。在命令行下输入man notify-send即可看见:
man notify-send
2、tput 命令
tput命令用于设置终端特性。通过tput你可以设置:
在屏幕上移动光标。
获取终端信息。
设置颜色(背景和前景)。
设置加粗模式。
设置反转模式等等。
下面有一段示例代码:
#!/bin/bash
# clear the screen
tput clear
# move cursor to screen location x,y (top left is 0,0)
tput cup 3 15
# set a foreground colour using ansi escape
tput setaf 3
echo xyx corp ltd.
tput sgr0
tput cup 5 17
# set reverse video mode
tput rev
echo m a i n - m e n u
tput sgr0
tput cup 7 15
echo 1. user management
tput cup 8 15
echo 2. service management
tput cup 9 15
echo 3. process management
tput cup 10 15
echo 4. backup
# set bold mode
tput bold
tput cup 12 15
read -p enter your choice [1-4] choice
tput clear
tput sgr0
tput rc
示例输出:
linux / unix script colours and cursor movement with tput
关于tput命令的详细信息,参见手册:
man 5 terminfo
man tput
3、setleds 命令
setleds 命令允许你设置键盘灯。下面是打开数字键灯的示例:
setleds -d +num
关闭数字键灯,输入:
setleds -d -num
-caps:关闭大小写锁定灯
+caps:打开大小写锁定灯
-scroll:关闭滚动锁定灯
+scroll:打开滚动锁定灯
查看setleds手册可看见更多信息和选项man setleds。
4、zenity 命令
zenity 命令显示 gtk+ 对话框,并且返回用户输入。它允许你使用各种 shell 脚本向用户展示或请求信息。下面是一个whois指定域名目录服务的 gui 客户端示例。
#!/bin/bash
# get domain name
_zenity=/usr/bin/zenity
_out=/tmp/whois.output.$$
domain=$(${_zenity} --title enter domain
--entry --text enter the domain you would like to see whois info )
if [ $? -eq 0 ]
then
# display a progress dialog while searching whois database
whois $domain | tee >(${_zenity} --width=200 --height=100
--title=whois --progress
--pulsate --text=searching domain info...
--auto-kill --auto-close
--percentage=10) >${_out}
# display back output
${_zenity} --width=800 --height=600
--title whois info for $domain
--text-info --filename=${_out}
else
${_zenity} --error
--text=no input provided
fi
示例输出:
zenity: linux / unix display dialogs boxes from the shell scripts
参见手册获取更多zenity信息以及其他支持 gtk+ 的组件:
zenity --help
man zenity
5、kdialog 命令
kdialog 命令与 zenity 类似,但它是为 kde 桌面和 qt 应用设计。你可以使用 kdialog 展示对话框。下面示例将在屏幕上显示信息:
kdialog --dontagain myscript:nofilemsg --msgbox file: '~/.backup/config' not found.
示例输出:
kdialog: suppressing the display of a dialog
6、dialog
dialog 是一个使用 shell 脚本的应用,显示用户界面组件的文本。它使用 curses 或者 ncurses 库。下面是一个示例代码:
#!/bin/bash
dialog --title delete file
--backtitle linux shell script tutorial example
--yesno are you sure you want to permanently delete /tmp/foo.txt? 7 60
# get exit status
# 0 means user hit [yes] button.
# 1 means user hit [no] button.
# 255 means user hit [esc] key.
response=$?
case $response in
0) echo file deleted.;;
1) echo file not deleted.;;
255) echo [esc] key pressed.;;
esac
参见 dialog 手册获取详细信息:man dialog。
关于其他用户界面工具的注意事项
unix、linux 提供了大量其他工具来显示和控制命令行中的应用程序,shell 脚本可以使用一些 kde、gnome、x 组件集:
gmessage- 基于 gtk xmessage 的克隆
xmessage- 在窗口中显示或询问消息(基于 x 的 /bin/echo)
whiptail- 显示来自 shell 脚本的对话框
python-dialog- 用于制作简单文本或控制台模式用户界面的 python 模块
7、logger 命令
logger命令将信息写到系统日志文件,如:/var/log/messages。它为系统日志模块 syslog 提供了一个 shell 命令行接口:
logger mysql database backup failed.
tail -f /var/log/messages
logger -t mysqld -p daemon.error database server failed
tail -f /var/log/syslog
示例输出:
apr 20 00:11:45 vivek-desktop kernel: [38600.515354] cpu0: temperature/speed normal
apr 20 00:12:20 vivek-desktop mysqld: database server failed
可以查看 logger 手册获取详细信息:man logger
8、setterm 命令
setterm 命令可设置不同的终端属性。下面的示例代码会强制屏幕在 15 分钟后变黑,监视器则 60 分钟后待机。
setterm -blank 15 -powersave powerdown -powerdown 60
下面的例子将 xterm 窗口中的文本以下划线展示:
setterm -underline on;
echo add your important message here
setterm -underline off
另一个有用的选项是打开或关闭光标显示:
setterm -cursor off
打开光标:
setterm -cursor on
参见 setterm 命令手册获取详细信息:man setterm
9、smbclient:给 ms-windows 工作站发送消息
smbclient 命令可以与 smb/cifs 服务器通讯。它可以向 ms-windows 系统上选定或全部用户发送消息。
smbclient -m winxppro /dev/null && echo tcp port 25 open || echo tcp port 25 close
下面的代码片段,你可以利用 bash 循环找出已打开的端口:
echo scanning tcp ports...
for p in {1..1023}
do
(echo >/dev/tcp/localhost/$p) >/dev/null 2>&1 && echo $p open
done
示例输出:
scanning tcp ports...
22 open
53 open
80 open
139 open
445 open
631 open
下面的示例中,你的 bash 脚本将像 http 客户端一样工作:
#!/bin/bash
exec 3 /dev/tcp/${1:-www.cyberciti.biz}/80
printf get / http/1.0
>&3
printf accept: text/html, text/plain
>&3
printf accept-language: en
>&3
printf user-agent: nixcraft_bashscript v.%s
${bash_version} >&3
printf
>&3
while read line <&3
do
# do something on $line
# or send $line to grep or awk for grabbing data
# or simply display back data with echo command
echo $line
done
参见 bash 手册获取更多信息:man bash
关于 gui 工具和 cron 任务的注意事项
如果你 使用 crontab 来启动你的脚本,你需要使用 export display=[用户机器]:0 命令请求本地显示或输出服务。举个例子,使用 zenity 工具调用/home/vivek/scripts/monitor.stock.sh:
@hourly display=:0.0 /home/vivek/scripts/monitor.stock.sh
你有喜欢的可以增加 shell 脚本趣味的 unix 工具么?请在下面的评论区分享它吧。
全息投影技术有哪些技术难点
芯片滤波器设计实战指南
五款经典运放电路分享
商务部公布今年双11全网销售额 相比阿里多近600个亿
罗德与施瓦茨FPH手持式频谱分析仪提供44GHz测量频率
10 个增加 UNIX/Linux Shell 脚本趣味的工具
uboot图形化配置及其原理
整流电路的作用
首款支持最新蓝牙5.0功能的磁带录音机问世
3D视觉传感器——包装和物流案例分析(机器人拾取放)
深圳宝安机场构建立体化机场安防体系
华为AM08小天鹅蓝牙音箱怎么样 值不值得买
就目前的人类自动化发展水平 机器人在十年之内大量代替人类势在必行
如何玩转永磁无刷直流电机控制?
广西智能电网三年行动计划推进为农村智能电网建设迈出了实质性步伐
什么是扣肉(酷睿)
噪声驱动声音发生器电路原理图讲解
存储技术正在不断的演变与进化
深圳2023光明科学城智能传感器加速营正式启动
OPPO可公布多项自动驾驶技术专利