技术标签: 技术干活
有些误解认为 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 命令[1] 或 apt-get 命令[2] 安装的包:
sudo apt-get install libnotify-bin
CentOS/RHEL 用户使用下面的 yum 命令[3]:
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
这里:
关于更多使用 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
查看 setleds 手册可看见更多信息和选项 man setleds。
4、zenity 命令
zenity 命令显示 GTK+ 对话框[4],并且返回用户输入。它允许你使用各种 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
参见 《KDE 对话框 Shell 脚本编程[5]》 教程获取更多信息。
6、Dialog
Dialog 是一个使用 Shell 脚本的应用[6],显示用户界面组件的文本。它使用 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 组件集:
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
参见 《如何写消息到 syslog 或 日志文件[7]》 获得更多信息。此外,你也可以查看 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 <<eof Message 1 Message 2 ... .. EOF
或
echo "${Message}" | smbclient -M salesguy2
参见 smbclient 手册或者阅读我们之前发布的文章:《给 Windows 工作站发送消息[8]》:man smbclient
10、Bash 套接字编程
在 bash 下,你可以打开一个套接字并通过它发送数据。你不必使用 curl 或者 lynx 命令抓取远程服务器的数据。bash 和两个特殊的设备文件可用于打开网络套接字。以下选自 bash 手册:
你可以使用这项技术来确定本地或远程服务器端口是打开或者关闭状态,而无需使用 nmap 或者其它的端口扫描器。
# find out if TCP port 25 open or not (echo >/dev/tcp/localhost/25) &>/dev/null && echo "TCP port 25 open" || echo "TCP port 25 close"
下面的代码片段,你可以利用 bash 循环找出已打开的端口[9]:
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\r\n" >&3 printf "Accept: text/html, text/plain\r\n" >&3 printf "Accept-Language: en\r\n" >&3 printf "User-Agent: nixCraft_BashScript v.%s\r\n" "${BASH_VERSION}" >&3 printf "\r\n" >&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[10] 来启动你的脚本,你需要使用 export DISPLAY=[用户机器]:0 命令请求本地显示或输出服务。举个例子,使用 zenity 工具调用 /home/vivek/scripts/monitor.stock.sh:
@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh
你有喜欢的可以增加 shell 脚本趣味的 UNIX 工具么?请在下面的评论区分享它吧。
关于作者
本文作者是 nixCraft 创始人、一个老练的系统管理员、Linux 操作系统和 UNIX shell 编程培训师。他服务来自全球的客户和不同的行业,包括 IT 、教育、防务和空间探索、还有非营利组织。你可以在 Twitter[11],Facebook[12],Google+[13] 上面关注他。
文章浏览阅读4.6k次,点赞11次,收藏57次。(1)反向传播:该方法主要是应用链式法则的方法,求loss关于w和b的导数;(2)关于如下步骤中,l.backward()会将前向的各部梯度存入,而红色的两个代码会形成“计算图”;(3)其中:w是Tensor(张量类型),Tensor中包含data和grad,data和grad也是Tensor。grad初始为None,调用l.backward()方法后w.grad为Tensor,故更新w.data时需使用w.grad.data。_反向传播实例及代码
文章浏览阅读3.7k次,点赞4次,收藏16次。目录1 聚合查询1.1 MongoDB的聚合查询2 聚合管道方法2.1 聚合流程2.1.1 详细流程2.2 聚合语法2.2.1 参数说明2.2.2 注意事项2.3 常用聚合管道2.3.1 与mysql聚合类比3 使用示例3.1 统计所有数据3.2 对所有城市人数求合3.3 对城市缩写相同的城市人数求合3.4 state重复的城市个数3.5 state重复个数大于100的城市4 MapReduce4.1 什么是MapReduce4.1.1 执行阶段4.1.2 语法_mongodb分组查询
文章浏览阅读788次。云服务器可以改系统吗?腾佑小编给出的答案是:可以的,云服务器可以改系统,不过更换系统是一个高风险操作。在更换系统盘之前,务必认真阅读服务商给出的注意事项。云服务器改系统的风险有:1.原系统盘的会被释放,建议提前创建快照备份数据。2.更换系统盘需要停止实例,因此会中断网站的业务。3.更换完成后,需要在新的系统盘中重新部署业务运行环境,有可能会对业务造成长时间的中断。更换系统盘相当于重新为云服务器实例...
文章浏览阅读6.1k次,点赞4次,收藏35次。参考Linux USB DWC3 Host/Peripheral DriverZynq Ultrascale MPSOC Linux USB device driverU-Boot USB DriverZynq UltraScale+ MPSoC USB 3.0 Mass Storage Device Class DesignZynq UltraScale+ MPSoC USB 3.0...
文章浏览阅读5.8w次,点赞40次,收藏238次。本文主要介绍离散余弦变换(DCT),从图像的二维离散变换入手,引出变换核的可分性与对称性导出DCT,并给出实现代码。_dcd余弦变化
文章浏览阅读3.9w次,点赞5次,收藏23次。发送post请求 1 r = requests.post("http://pythontab.com/postTest", data = {"key":"value"}) 以上得知,post请求参数是以data关键字参数来传递的。现在的data参数传递的是字典,我们也可以传递一个json格式的数据,如下: 1 2 3 ...
文章浏览阅读204次。package code;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLExcep..._java商家 alipay 账单拉取
文章浏览阅读2.6k次。入门JAVA程序员需要配置什么样的笔记本?一般java程序员使用的笔记本配置有多高,怎么样才能让java程序员安心的工作!要求:1.可以运行MyEclipse,Tomcat,MySQL,oracle,flex等java web编程的软件。可能还会涉及到安卓开发。2.偶尔看看电影什么的。3.内存最好大一点,不然运行代码怕占用内存太高。5.屏幕最好能稍微大一点,看电影,敲代码会更舒服一点。6.预算在5..._java程序员笔记本配置
文章浏览阅读1w次,点赞37次,收藏221次。模块是python程序架构的一个核心概念。每一个以扩展名py结尾的python源代码文件都是一个模块,模块名同样也是一个标识符,需要符合标识符的命名规则,在模块中定义的全局变量、函数、类都是提供给外界直接使用的工具,模块就好比工具包,要想使用这个工具包中的工具,就需要先的导入这个模。
文章浏览阅读1.3w次,点赞69次,收藏69次。一、按索引排序:sort_index() 1. Series类型排序 1)升序 2)降序 2. DataFrame类型排序 1)按行索引排序 2)按列索引排序二、按值排序:sort_values() 1. Series类型排序 1)升序 2)降序 2. DataFrame类型排序 1)单列排序 2)多列排序 3)排序算法 _pandas rank sort_value
文章浏览阅读10w+次,点赞597次,收藏3.5k次。史上最全、最新、最详细的Java基础面试题汇总_白大锅,java基础面试题(2022最新版汇总)
文章浏览阅读3.9k次,点赞2次,收藏9次。前两天一直在搞open62541,因为milo库的server sdk没有办法根据xml生成结点文件,于是准备用open62541来搭建服务器,milo结合Spring Boot来构件客户端。网络上大多是建立一个open62541.h的头文件,还有就是open62541.c的执行文件,但是新版好像并不是这样的。然后很多教程都是讲的linux,但是初学者用linux的还是比较少,所我写了这一篇帮..._java open62541