17 使用 GNU/Linux 有必要學程式設計嗎?

當然是不需要,只是為求工作上的效率,個人認為學點 shell script 的語法,在處理一些重複性的問題時會有相當大的幫助。例如 GNU/Linux 預設的是 bash,大家看看 /etc 下的一些控制 script 就會知道 bash 的用處有多大了,這些 script 每次開關機、login, logout 都要用到,甚至平常固定時間會執行的工作也會用到,例如,有時看到硬碟在哀哀叫,我在第一次碰到時還真嚇了一跳,不曉得發生了什麼重大事故,原來這是長駐在系統中的 crond 在執行例行工作了,把系統 locate 要用到的資料庫更新,如果您也碰到,別猶豫,命令列打個 ps aux 或 top 看到底是發生了什麼事。

至於其他的程式語言,由於我不是資訊料班出身的,只能說說我的看法供參考。前面說過,GNU/Linux 是程式設計者的天堂。原因是工具(如各種編譯、組譯器)都具備,而且程式碼到處都是,想學程式設計的話,例子隨手可得,甚至 kernel 本身也都有 source code 可以觀摩,很容易就可以由別人的程式碼啟發靈感。這麼好的環境,不學點程式語言就有點太浪費了。:)

學哪一種語言好呢?這是沒有定論的,至少,就是高手級的 hacker 們,都會意見相左。我是不管人家怎麼說,自己用得最順手,最重要,再好的語言,學了半天派不上用場,那乾脆不學也罷,多花時間去看電影、遊山玩水,還來得有價值。況且,有十全十美的程式語言嗎?好像不曾聽說。能讓我解決問題的語言(別人能解決,那是他的能力,不是自己的),我想,對我而言就是好的程式語言。有不能解決一般問題的程式語言嗎?好像也不曾聽說。:)

當然 GNU/Linux 的母語是 C,如果您懂 C 的話,使用 GNU/Linux 會愉快得多,因為 GNU/Linux 裡頭的程式,99.9% 其程式碼都是公開的!不懂 C 但懂一點 shell script 的話,也是可以玩得不亦樂乎!總之,視您的用途而定,千萬別以為一定要學程式設計才夠資格使用 GNU/Linux。

既然 C 是 Un*x 系統的母語,因此,有機會可以考慮熟悉。要快點入門,快點拿來用的話,或許 bash/Perl/Python 都是不錯的選擇。我的經驗是,先拿個簡單又實用的例子的程式碼來瞧瞧(看不懂沒關係,大致上有個感覺就行了),覺得不錯,再來翻相關資料。請千萬記得,他們都只是個工具,不要本末倒置了。所要面對的問題背後的相關背景知識可能會比語法更重要,一位程式高手,但卻不懂會計處理流程,他是寫不出像樣的會計軟體來的。

什麼?是要 GUI?我是勸大家先學走再來學跑。不過,偷機一下,連 bash 也可以 GUI。請先確定系統上有安裝 Xdialog,在命令列下:

which Xdialog
看是否存在,不存在的話,就得另行安裝,先把安裝光碟 mount 上來,找找看,應該目前一般 distro 都會附上,萬一沒有,別忘了如何找軟體,請參考第 13 節的說明。然後,編輯一個 bashgui 檔,內容如下:

#!/bin/sh
# bash + Xdialog 的測試
CANCEL="您按了 Cancel 鍵!"
CLOSE="測試結束。"

(sleep 2;echo "XXX";echo "新訊息!"; \
echo "XXX";sleep 1;echo "XXXX") | \
Xdialog --title "測試一" --infobox "測試一" 12 30 0

case $? in
  1)
    echo $CANCEL;;
  255)
    echo $CLOSE;;
esac

(sleep 2;echo "XXX";echo "有趣的";echo "\\n";echo \
"bash GUI"; echo "XXX";sleep 1;echo "XXXX") | \
Xdialog --title "測試二" \
        --no-button --infobox "測試二 (no button)" 12 30 0

if [ "$?" = 255 ] ; then
  echo $CLOSE;;
fi

Xdialog --title "輸入測試" \
        --inputbox "測試三,中文輸入測試。\n \
	            嗨!請輸入一些中文字來玩玩。\n" \
	12 30 2> /tmp/testbox.tmp.$$

return=$?
input=`cat /tmp/testbox.tmp.$$`
rm -f /tmp/testbox.tmp.$$
case $return in
  0)
    echo "您輸入了: '$input'";;
  1)
    echo $CANCEL;;
  255)
    echo $CLOSE;;
esac

編輯好後存檔,改變其檔案模式並且在具有中文環境的終端機(如 rxvt)執行:

chmod +x bashgui
./bashgui

請參考圖 3 bashgui 測試。更深入的就得研讀 bash 及 Xdialog 的文件了,bash 的文件請參考第 18 節,第 27 項的說明,Xdialog 的話,可以參考程式所附文件,一般會在 /usr/share/doc 目錄下,及 man Xdialog。這裡只是說明有許多方式可以達成同一個目的,解決同樣的問題,而不是在程式設計教學。

Figure: bashgui 測試
Image bashgui

如果對 FS/OSS 的程式開發有興趣(好奇也可以啦!),可以先參考以下的文件:

http://www.study-area.org/cyril/opentools/opentools/book1.html(中文)
http://catb.org/~esr/writings/taoup/html/index.html(英文)
第一篇是 yushi(黃郁熙)寫的《用 Open Source 工具開發軟體》,很具參考價值。第二篇則是頂頂大名的 ESR(Eric S. Raymond) 所寫的 ``The Art of Unix Programming'' 已經出版成書,這是線上版本。

Compiled by Edward G.J. Lee (2004-02-14)