Debian教程

Debian解释型语言脚本

在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 代码时应当谨慎行事,避免过度复杂化。

广告合作
QQ群号:707632017

温馨提示:

1、本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com。(#改为@)

2、本站原创内容未经允许不得转裁,转载请注明出处“站长百科”和原文地址。

目录