在Debian系统中,解释型语言脚本通常用于自动化任务、系统管理等,这些脚本可以用Bash、Python、Perl等编程语言编写。本篇教程将介绍Debian调试解释型语言代码、使用 shell 脚本的 GUI 程序和定制 GUI文件管理器的行为等方面。
解释器相关软件包列表:
软件包 | 流行度 | 大小 | 文档 |
dash | V:883, I:997 | 191 | sh: 小和快的 POSIX 兼容的 shell,用于 sh |
bash | V:837, I:999 | 7175 | sh: 由 bash-doc 包提供的“info bash” |
mawk | V:437, I:997 | 285 | AWK: 小和快的 awk |
gawk | V:286, I:351 | 2906 | AWK: 由 gawk-doc 包提供的“info gawk” |
perl | V:702, I:989 | 673 | Perl: perl(1) |
libterm-readline-gnu-perl | V:2, I:29 | 380 | GNU ReadLine/History 库的 Perl 扩展: perlsh(1) |
libreply-perl | I:0 | 171 | Perl 的 REPL : reply(1) |
libdevel-repl-perl | V:0, I:0 | 237 | Perl 的 REPL : re.pl(1) |
python3 | V:714, I:951 | 81 | Python: python3(1) |
tcl | V:25, I:223 | 20 | Tcl: tcl(3) |
tk | V:20, I:217 | 20 | Tk:tk(3) |
ruby | V:85, I:211 | 29 | Ruby: ruby(1), erb(1), irb(1), rdoc(1), ri(1) |
当你希望在 Debian 上自动化执行一个任务,你应当首先使用解释型语言脚本。选择解释型语言的准则是:
- 使用 dash,如果任务是简单的,使用 shell 程序联合 CLI 命令行程序;
- 使用 python3,如果任务不是简单的,你从零开始写;
- 使用 perl、tcl、ruby……,如果在 Debian 上有用这些语言写的现存代码,需要为完成任务进行调整。
如果最终代码太慢,为提升执行速度,你可以用编译型语言重写关键部分,从解释型语言调用。
一、调试解释型语言代码
大部分解释器提供基本的语法检查和代码跟踪功能。
- “dash -n script.sh” – Shell 脚本语法检查;
- “dash -x script.sh” – 跟踪一个 Shell 脚本;
- “python -m py_compile script.py” – Python 脚本语法检查;
- “python -mtrace –trace script.py” – 跟踪一个 Python 脚本;
- “perl -I ../libpath -c script.pl” – Perl 脚本语法检查;
- “perl -d:Trace script.pl” – 跟踪一个 Perl 脚本。
为了测试 perl 代码,尝试下 Perl 的 REPL 环境,它为 Perl 提供了 Python 类似的 REPL (=READ + EVAL + PRINT + LOOP) 环境。
二、使用GUI程序
shell 脚本能够被改进用来制作一个吸引人的 GUI(图形用户界面)程序,其技巧是用一个所谓的对话程序来代替使用 echo 和 read 命令的乏味交互。
对话(dialog )程序列表:
软件包 | 流行度 | 大小 | 说明 |
x11-utils | V:197, I:564 | 651 | xmessage(1):在一个窗口中显示一条消息或疑问(X) |
whiptail | V:274, I:996 | 56 | 从 shell 脚本中显示用户友好的对话框(newt) |
dialog | V:11, I:101 | 1227 | 从 shell 脚本中显示用户友好的对话框(ncurses) |
zenity | V:76, I:362 | 183 | 从 shell 脚本中显示图形对话框(GTK) |
ssft | V:0, I:0 | 75 | Shell 脚本前端工具 (zenity, kdialog, and 带有 gettext 的 dialog 封装) |
gettext | V:57, I:259 | 5817 | “/usr/bin/gettext.sh”:翻译信息 |
这里是一个用来演示的 GUI 程序的例子,仅使用一个 shell 脚本是多么容易。
这个脚本使用 zenity 来选择一个文件 (默认 /etc/motd) 并显示它。
#!/bin/sh -e # Copyright (C) 2021 Osamu Aoki <osamu@debian.org>, Public Domain # vim:set sw=2 sts=2 et: DATA_FILE=$(zenity --file-selection --filename="/etc/motd" --title="Select a file to check") || \ ( echo "E: File selection error" >&2 ; exit 1 ) # Check size of archive if ( file -ib "$DATA_FILE" | grep -qe '^text/' ) ; then zenity --info --title="Check file: $DATA_FILE" --width 640 --height 400 \ --text="$(head -n 20 "$DATA_FILE")" else zenity --info --title="Check file: $DATA_FILE" --width 640 --height 400 \ --text="The data is MIME=$(file -ib "$DATA_FILE")" fi
这种使用 shell 脚本的 GUI 程序方案只对简单选择的场景有用。如果你写一个其它任何复杂的程序,请考虑在功能更强的平台上写。
三、定制GUI文件管理器
GUI(图形用户界面)文件管理器在选定的文件上,能够用外加的扩展软件包来扩展执行一些常见行为。通过增加特定的脚本,它们也能够用来定制执行非常特殊的行为。
四、Perl短脚本
处理数据时,Shell 脚本经常依赖于创建子进程来运行诸如 cut、grep、sed 等外部命令,这种多进程的方式往往会导致执行效率降低。相对而言,Perl 拥有强大的内部数据处理能力,能够更迅速地完成数据处理任务。
让我们考虑下面一行 AWK 脚本片段和它在 Perl 中的等价物。
awk '($2=="1957") { print $3 }' |
这等价于下列的任意一行。
perl -ne '@f=split; if ($f[1] eq "1957") { print "$f[2]\n"}' |
perl -ne 'if ((@f=split)[1] eq "1957") { print "$f[2]\n"}' |
perl -ne '@f=split; print $f[2] if ( $f[1]==1957 )' |
perl -lane 'print $F[2] if $F[1] eq "1957"' |
perl -lane 'print$F[2]if$F[1]eq+1957' |
最后一个简直就是个迷。它用上了下面列出的这些 Perl 的特型。
- 空格为可选项;
- 存在从数字到字符串的自动转换;
- 通过命令行选项: perlrun(1) 的 Perl 执行技巧;
- Perl 特异变量:perlvar(1)。
注意:Perl的灵活性有时也可能导致代码变得难以理解和维护,因此编写 Perl 代码时应当谨慎行事,避免过度复杂化。