Merge pull request #8368 from wxy/20100419-10-Tools-To-Add-Some-Spice-To-Your-UNIX-Linux-Shell-Scripts

PRF&PUB:20100419 10 Tools To Add Some Spice To Your UNIX Linux Shell Scripts
This commit is contained in:
Xingyu.Wang 2018-04-03 17:52:19 +08:00 committed by GitHub
commit c1ee5462dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,13 +1,13 @@
# 10 个增加 UNIX/Linux Shell 脚本趣味的工具
10 个增加 UNIX/Linux Shell 脚本趣味的工具
======
有些误解认为 shell 脚本仅用于 CLI 环境。实际上在 KDE 或 Gnome 桌面下,你可以有效的使用各种工具编写 GUI 或者网络socket脚本。shell 脚本可以使用一些 GUI 组件(菜单、警告框、进度条等),你可以控制终端输出、光标位置以及各种输出效果等等。利用下面的工具,你可以构建强壮的、可交互的、对用户友好的 UNIX/Linux bash 脚本。
制作 GUI 应用不是一项昂贵的任务但需要时间和耐心。幸运的是UNIX 和 Linux 都带有大量编写漂亮 GUI 脚本的工具。以下工具是基于 FreeBSD 和 Linux 操作系统做的测试,而且也适用于其他类 UNIX 操作系统。
制作 GUI 应用不是一项困难的任务但需要时间和耐心。幸运的是UNIX 和 Linux 都带有大量编写漂亮 GUI 脚本的工具。以下工具是基于 FreeBSD 和 Linux 操作系统做的测试,而且也适用于其他类 UNIX 操作系统。
### 1#notify-send 命令
### 1notify-send 命令
notify-send 命令允许你使用通知守护进程发送桌面通知给用户。这种避免侵入用户的方式,对于通知桌面用户一个事件或显示一些信息是有用的。在 Debian 或 Ubuntu 上,你需要使用 [apt 命令][1] 或 [apt-get 命令][2] 安装的包:
`notify-send` 命令允许你借助通知守护进程发送桌面通知给用户。这种避免打扰用户的方式,对于通知桌面用户一个事件或显示一些信息是有用的。在 Debian 或 Ubuntu 上,你需要使用 [apt 命令][1] 或 [apt-get 命令][2] 安装的包:
```bash
sudo apt-get install libnotify-bin
@ -24,7 +24,7 @@ Fedora Linux 用户使用下面的 dnf 命令:
```bash
`$ sudo dnf install libnotify`
In this example, send simple desktop notification from the command line, enter:
### send some notification ##
### 发送一些通知 ###
notify-send "rsnapshot done :)"
```
@ -35,7 +35,7 @@ notify-send "rsnapshot done :)"
下面是另一个附加选项的代码:
```bash
....
...
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; }
@ -48,25 +48,25 @@ live=$(lynx --dump http://money.rediff.com/ | grep 'BSE LIVE' | awk '{ print $5}
这里:
* -t 5000: 指定超时时间(毫秒) 5000 毫秒 = 5 秒)
* -u low : 设置紧急等级 (如:低、普通、紧急)
* -i gtk-dialog-info : 设置要显示的图标名称或者指定的图标(你可以设置路径为:-i /path/to/your-icon.png
* `-t 5000`指定超时时间(毫秒) 5000 毫秒 = 5 秒)
* `-u low` 设置紧急等级 (如:低、普通、紧急)
* `-i gtk-dialog-info` 设置要显示的图标名称或者指定的图标(你可以设置路径为:`-i /path/to/your-icon.png`
关于更多使用 notify-send 功能的信息,请参考 notify-send 手册。在命令行下输入 `man notify-send` 即可看见:
关于更多使用 `notify-send` 功能的信息,请参考 man 手册。在命令行下输入 `man notify-send` 即可看见:
```bash
man notify-send
```
### #2tput 命令
### 2、tput 命令
tput 命令用于设置终端特性。通过 tput 你可以设置:
`tput` 命令用于设置终端特性。通过 `tput` 你可以设置:
* 在屏幕上移动光标。
* 获取终端信息。
* 设置颜色(背景和前景)。
* 设置加粗模式。
* 设置反模式等等。
* 设置反模式等等。
下面有一段示例代码:
@ -116,16 +116,16 @@ tput rc
![Fig.03: tput in action][6]
关于 tput 命令的详细信息,参见手册:
关于 `tput` 命令的详细信息,参见手册:
```bash
man 5 terminfo
man tput
```
### #3setleds 命令
### 3、setleds 命令
setleds 命令允许你设置键盘灯。下面是打开数字键灯的示例:
`setleds` 命令允许你设置键盘灯。下面是打开数字键灯的示例:
```bash
setleds -D +num
@ -137,18 +137,16 @@ setleds -D +num
setleds -D -num
```
* -caps关闭大小写锁定
* +caps打开大小写锁定
* -scroll关闭滚动锁定
* +scroll打开滚动锁定
* `-caps`:关闭大小写锁定
* `+caps`:打开大小写锁定
* `-scroll`:关闭滚动锁定
* `+scroll`:打开滚动锁定
查看 setleds 手册可看见更多信息和选项:
查看 `setleds` 手册可看见更多信息和选项 `man setleds`
`man setleds`
### 4、zenity 命令
### #4zenity 命令
[zenity 命令显示 GTK+ 对话框][7],并且返回用户输入。它允许你使用各种 Shell 脚本向用户展示或请求信息。下面是 whois 指定域名目录服务的 GUI 客户端示例。
[zenity 命令显示 GTK+ 对话框][7],并且返回用户输入。它允许你使用各种 Shell 脚本向用户展示或请求信息。下面是一个 `whois` 指定域名目录服务的 GUI 客户端示例。
```bash
#!/bin/bash
@ -181,16 +179,16 @@ fi
![Fig.04: zenity in Action][8]
参见手册获取更多 zenity 信息以及其他支持 GTK+ 的组件:
参见手册获取更多 `zenity` 信息以及其他支持 GTK+ 的组件:
```bash
zenity --help
man zenity
```
### #5kdialog 命令
### 5、kdialog 命令
kdialog 命令与 zenity 类似,但它是为 KDE 桌面和 QT 应用设计。你可以使用 kdialog 展示对话框。下面示例将在屏幕上显示信息:
`kdialog` 命令与 `zenity` 类似,但它是为 KDE 桌面和 QT 应用设计。你可以使用 `kdialog` 展示对话框。下面示例将在屏幕上显示信息:
```bash
kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not found."
@ -202,7 +200,7 @@ kdialog --dontagain myscript:nofilemsg --msgbox "File: '~/.backup/config' not fo
参见 《[KDE 对话框 Shell 脚本编程][10]》 教程获取更多信息。
### #6Dialog
### 6、Dialog
[Dialog 是一个使用 Shell 脚本的应用][11],显示用户界面组件的文本。它使用 curses 或者 ncurses 库。下面是一个示例代码:
@ -224,21 +222,20 @@ case $response in
esac
```
参见 dialog 手册获取详细信息:
`man dialog`
参见 `dialog` 手册获取详细信息:`man dialog`。
### 关于其他用户界面工具的注意事项
#### 关于其他用户界面工具的注意事项
UNIX、Linux 提供了大量其他工具来显示和控制命令行中的应用程序shell 脚本可以使用一些 KDE、Gnome、X 组件集:
* **gmessage** - 基于 GTK xmessage 的克隆.
* **xmessage** - 在窗口中显示或查询消息X-based /bin/echo
* **whiptail** - 显示来自 shell 脚本的对话框
* **python-dialog** - 用于制作简单文本或控制台模式用户界面的 Python 模块
* `gmessage` - 基于 GTK xmessage 的克隆
* `xmessage` - 在窗口中显示或询问消息(基于 X 的 /bin/echo
* `whiptail` - 显示来自 shell 脚本的对话框
* `python-dialog` - 用于制作简单文本或控制台模式用户界面的 Python 模块
### #7logger 命令
### 7、logger 命令
logger 命令将信息写到系统日志文件,如: /var/log/messages。它为系统日志模块 syslog 提供了一个 shell 命令行接口:
`logger` 命令将信息写到系统日志文件,如:`/var/log/messages`。它为系统日志模块 syslog 提供了一个 shell 命令行接口:
```bash
logger "MySQL database backup failed."
@ -254,19 +251,17 @@ Apr 20 00:11:45 vivek-desktop kernel: [38600.515354] CPU0: Temperature/speed nor
Apr 20 00:12:20 vivek-desktop mysqld: Database Server failed
```
参见 《[如何写消息到 syslog 或 日志文件][12]》 获得更多信息。此外,你也可以查看 logger 手册获取详细信息:
参见 《[如何写消息到 syslog 或 日志文件][12]》 获得更多信息。此外,你也可以查看 logger 手册获取详细信息:`man logger`
`man logger`
### 8、setterm 命令
### #8setterm 命令
setterm 命令可设置不同的终端属性。下面的示例代码会强制屏幕在 15分钟后变黑监视器则待机 60 分钟。
`setterm` 命令可设置不同的终端属性。下面的示例代码会强制屏幕在 15 分钟后变黑,监视器则 60 分钟后待机。
```bash
setterm -blank 15 -powersave powerdown -powerdown 60
```
下面的例子将 xterm 窗口中的文本带有下划线展示:
下面的例子将 xterm 窗口中的文本下划线展示:
```bash
setterm -underline on;
@ -274,7 +269,7 @@ echo "Add Your Important Message Here"
setterm -underline off
```
另一个有用的选项是打开或关闭光标:
另一个有用的选项是打开或关闭光标显示
```bash
setterm -cursor off
@ -286,13 +281,11 @@ setterm -cursor off
setterm -cursor on
```
参见 setterm 命令手册获取详细信息:
参见 setterm 命令手册获取详细信息:`man setterm`
`man setterm`
### 9、smbclient给 MS-Windows 工作站发送消息
### #9smbclient给 MS-Windows 工作站发送消息
smbclient 命令可以与 SMB/CIFS 服务器通讯。它可以向 MS-Windows 系统上选定或全部用户发送消息。
`smbclient` 命令可以与 SMB/CIFS 服务器通讯。它可以向 MS-Windows 系统上选定或全部用户发送消息。
```bash
smbclient -M WinXPPro <<eof
@ -309,18 +302,16 @@ EOF
echo "${Message}" | smbclient -M salesguy2
```
参见 smbclient 手册或者阅读我们之前发布的文章:《[给 Windows 工作站发送消息][13]》
参见 `smbclient` 手册或者阅读我们之前发布的文章:《[给 Windows 工作站发送消息][13]》`man smbclient`
`man smbclient`
### 10、Bash 套接字编程
### #10Bash 套接字编程
在 bash 下,你可以打开一个套接字并通过它发送数据。你不必使用 `curl` 或者 `lynx` 命令抓取远程服务器的数据。bash 和两个特殊的设备文件可用于打开网络套接字。以下选自 bash 手册:
在 bash 下,你可以打开一个套接字并通过它发送数据。你不必使用 curl 或者 lynx 命令抓取远程服务器的数据。bash 和两个特殊的设备文件可用于打开网络套接字。以下选自 bash 手册:
1. `/dev/tcp/host/port` - 如果 `host` 是一个有效的主机名或者网络地址而且端口是一个整数或者服务名bash 会尝试打开一个相应的 TCP 连接套接字。
2. `/dev/udp/host/port` - 如果 `host` 是一个有效的主机名或者网络地址而且端口是一个整数或者服务名bash 会尝试打开一个相应的 UDP 连接套接字。
1. **/dev/tcp/host/port** - 如果 host 是一个有效的主机名或者网络地址而且端口是一个整数或者服务名bash 会尝试打开一个相应的 TCP 连接套接字。
2. **/dev/udp/host/port** - 如果 host 是一个有效的主机名或者网络地址而且端口是一个整数或者服务名bash 会尝试打开一个相应的 UDP 连接套接字。
你可以使用这项技术来确定本地或远程服务器端口是打开或者关闭状态,而无需使用 nmap 或者其它的端口扫描器。
你可以使用这项技术来确定本地或远程服务器端口是打开或者关闭状态,而无需使用 `nmap` 或者其它的端口扫描器。
```bash
# find out if TCP port 25 open or not
@ -370,15 +361,15 @@ do
done
```
参见 bash 手册获取更多信息:
参见 bash 手册获取更多信息:`man bash`
`man bash`
### 关于 GUI 工具和 cron 任务的注意事项
### 关于 GUI 工具和 Cronjob 的注意事项
如果你 [使用 crontab][15] 来启动你的脚本,你需要使用 `export DISPLAY=[用户机器]:0` 命令请求本地显示或输出服务。举个例子,使用 `zenity` 工具调用 `/home/vivek/scripts/monitor.stock.sh`
如果你 [使用 crontab][15] 来启动你的脚本,你需要使用 `export DISPLAY=[用户机器]:0` 命令请求本地显示或输出服务。举个例子,使用 zenity 工具调用 /home/vivek/scripts/monitor.stock.sh
`@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh`
```
@hourly DISPLAY=:0.0 /home/vivek/scripts/monitor.stock.sh
```
你有喜欢的可以增加 shell 脚本趣味的 UNIX 工具么?请在下面的评论区分享它吧。
@ -391,8 +382,8 @@ done
via: https://www.cyberciti.biz/tips/spice-up-your-unix-linux-shell-scripts.html
作者:[Vivek Gite][a]
译者:[译者ID](https://github.com/pygmalion666)
校对:[校对者ID](https://github.com/校对者ID)
译者:[pygmalion666](https://github.com/pygmalion666)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出