< /home),前者會給出詳細的錯誤消息 。另一方面,當它在獲得無效數(shù)據(jù)的早期就選擇放棄可能是理想的 。
安全漏洞經(jīng)常植根于在意料之外的數(shù)據(jù)面前表現(xiàn)得不夠健壯的程序中 。務(wù)必記住,優(yōu)秀的實用程序能夠設(shè)法在 shell 腳本中作為根(root)用戶身份運行 。諸如 find 這樣的程序中的緩沖區(qū)溢出可能會給大量的系統(tǒng)帶來風險 。
程序?qū)σ饬现獾臄?shù)據(jù)處理得越好,它就更可能適應(yīng)變化的環(huán)境 。通常,設(shè)法使程序更健壯會導致您更好地理解該程序的作用,從而更好地使之通用化 。
新穎
要編寫的最糟糕的實用程序種類之一就是您已經(jīng)有了的實用程序 。我編寫過一個名為 count 的美妙的實用程序 。它允許我執(zhí)行幾乎任何計數(shù)任務(wù) 。它是一個出色的實用程序,但是已經(jīng)有一個名為 jot 的標準 BSD 實用程序做同樣的事情 。同樣地,我的一個用于將數(shù)據(jù)轉(zhuǎn)換為列的靈活的程序重復了一個現(xiàn)有實用程序 rs 的功能,這個實用程序同樣可以在 BSD 系統(tǒng)上找到,只不過 rs 更靈活,設(shè)計得更好 。請參閱下面的 參考資料 以了解關(guān)于 jot 和 rs 的更多信息 。
如果您即將開始編寫一個實用程序,請花一點時間瀏覽一下各種系統(tǒng),以確定那樣的實用程序是否已經(jīng)存在 。不要害怕在 BSD 上借用 Linux 實用程序,或在 Linux 上借用 BSD 實用程序;實用程序代碼的樂趣之一在于,幾乎所有實用程序都具有很好的可移植性 。
不要忘了考察一下組合現(xiàn)有應(yīng)用程序來形成一個實用程序的可能性 。從理論上講,組合現(xiàn)有程序來形成的實用程序運行得不足夠快是可能的,但是編寫一個新的實用程序很少會比等待一個稍慢的管道更快 。
一個例子實用程序
從某種意義上,這個程序是一個可執(zhí)行文件,因為對于作為過濾器來說,它決不會有任何用處 。然而,它作為一個命令行實用程序卻工作得非常好 。
這個程序僅做一件事情 。它以近乎完美的輸出格式輸出 /usr/include/sys/errno.h 中的 errno 行 。例如:
$ errno 22
EINVAL [22]: Invalid argument
清單 2. errno 查找器
#!/bin/sh
usage() {
echo >&2 "usage: errno [numbers or error names]n"
exit 1
}
for i
do
case "$i" in
[0-9]*)
awk "/^#define/ && $3 == ""$i"" {
for (i = 5; i < NF;i) {
foo = foo " " $i;
}
printf("%-22s%sn", $2 " [" $3 "]:", foo);
foo = ""
}" < /usr/include/sys/errno.h
;;
E*)
awk "/^#define/ && $2 == """$i""" {
for (i = 5; i < NF;i) {
foo = foo " " $i;
}
printf("%-22s%sn", $2 " [" $3 "]:", foo);
foo = ""
}" < /usr/include/sys/errno.h
;;
*)
echo >&2 "errno: can"t figure out whether "$i" is a name or a number."
usage
;;
esac
done
這個程序通用化了嗎?是的,非常理想 。它同時支持數(shù)字和符號名稱 。另一方面,它不知道關(guān)于可能具有相同格式的其他文件的信息,比如 /usr/include/sys/signal.h ??梢匀菀椎財U展它來做到這點,但是對于這樣一個便利的實用能夠程序,簡單地創(chuàng)建一個名為“signal”的拷貝來讀取 signal.h,同時使用“SIG*”作為模式來匹配名稱,這樣會更容易 。
雖然這僅比對系統(tǒng)頭文件使用 grep 方便一小點,但是它更不容易出錯 。它不會因為考慮不周的參數(shù)而產(chǎn)生無用的結(jié)果 。另一方面,如果沒有從頭文件中找到給定的名稱或數(shù)字,它不會產(chǎn)生診斷信息 。它也不會費心去糾正某些輸入錯誤 。而且,由于命令行實用程序從來沒有打算在自動化的環(huán)境中使用,因此它的上述特性無可非議 。
另一個例子可能是取消對輸入排序的程序(請參閱 參考資料 以獲得指向此實用程序的鏈接) 。這相當簡單;也就是讀入輸入文件,以某種方式存儲它們,然后生成一個隨機順序來輸出那些行 。這是一個幾乎具有無限應(yīng)用前景的實用程序 。編寫這個實用程序也比編寫排序程序容易得多;例如,您不需要指定您沒有對哪些鍵排序,或者是您希望按字母順序、詞法順序還是按數(shù)字順序隨機排序 。棘手的部分在于讀入可能非常長的行 。事實上,上面提供的版本在搞欺騙;它假設(shè)所讀入的行中沒有空字節(jié) 。糾正這個問題要困難多了,我在編寫它時懶得去理會它 。
推薦閱讀
- 安裝顯卡好簡單
- lilo/grub linux忘記了密碼怎么辦
- vmware 配置實例-linux host + windows guest + fire
- Linux 內(nèi)核的類型
- 其它 Linux 常用命令
- 改變文件或目錄的訪問權(quán)限 Linux 常用命令
- 備份與壓縮 Linux 常用命令
- 在Linux環(huán)境下運行DOS命令 Linux 常用命令
- 入門:Linux 2.6 內(nèi)核的嵌入式系統(tǒng)應(yīng)用
- 安裝過Windows的電腦上如何安裝Linux
