在Debian系統(tǒng)中,解釋型語言腳本通常用于自動化任務(wù)、系統(tǒng)管理等,這些腳本可以用Bash、Python、Perl等編程語言編寫。本篇教程將介紹Debian調(diào)試解釋型語言代碼、使用 shell 腳本的 GUI 程序和定制 GUI文件管理器的行為等方面。
解釋器相關(guān)軟件包列表:
軟件包 | 流行度 | 大小 | 文檔 |
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 上自動化執(zhí)行一個任務(wù),你應(yīng)當首先使用解釋型語言腳本。選擇解釋型語言的準則是:
- 使用 dash,如果任務(wù)是簡單的,使用 shell 程序聯(lián)合 CLI 命令行程序;
- 使用 python3,如果任務(wù)不是簡單的,你從零開始寫;
- 使用 perl、tcl、ruby……,如果在 Debian 上有用這些語言寫的現(xiàn)存代碼,需要為完成任務(wù)進行調(diào)整。
如果最終代碼太慢,為提升執(zhí)行速度,你可以用編譯型語言重寫關(guān)鍵部分,從解釋型語言調(diào)用。
一、調(diào)試解釋型語言代碼
大部分解釋器提供基本的語法檢查和代碼跟蹤功能。
- “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 環(huán)境,它為 Perl 提供了 Python 類似的 REPL (=READ + EVAL + PRINT + LOOP) 環(huán)境。
二、使用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 程序方案只對簡單選擇的場景有用。如果你寫一個其它任何復(fù)雜的程序,請考慮在功能更強的平臺上寫。
三、定制GUI文件管理器
GUI(圖形用戶界面)文件管理器在選定的文件上,能夠用外加的擴展軟件包來擴展執(zhí)行一些常見行為。通過增加特定的腳本,它們也能夠用來定制執(zhí)行非常特殊的行為。
四、Perl短腳本
處理數(shù)據(jù)時,Shell 腳本經(jīng)常依賴于創(chuàng)建子進程來運行諸如 cut、grep、sed 等外部命令,這種多進程的方式往往會導(dǎo)致執(zhí)行效率降低。相對而言,Perl 擁有強大的內(nèi)部數(shù)據(jù)處理能力,能夠更迅速地完成數(shù)據(jù)處理任務(wù)。
讓我們考慮下面一行 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 的特型。
- 空格為可選項;
- 存在從數(shù)字到字符串的自動轉(zhuǎn)換;
- 通過命令行選項: perlrun(1) 的 Perl 執(zhí)行技巧;
- Perl 特異變量:perlvar(1)。
注意:Perl的靈活性有時也可能導(dǎo)致代碼變得難以理解和維護,因此編寫 Perl 代碼時應(yīng)當謹慎行事,避免過度復(fù)雜化。