2008年3月13日

把REBOL當Shell用

所謂的Shell,就是圍繞在OS核心外圍的使用者介面,你可以參考「當劇本遇上殼」這篇文章對Shell的說明。

本文章介紹一些常用的函數與用法,讓你可以將REBOL當作Shell,用來對OS做一些基本的檔案操作。

【目前的目錄】

如果你想知道目前的工作目錄為何,你可以利用what-dir函數,如下:

>> what-dir
== %/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/

「==」表示前面的函數有傳出值,其值為「%/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/」。

你也可以用pwd取代what-dir,效果完全一樣:

>> pwd
== %/c/Documents%20and%20Settings/Jerry%20Tsai/桌面/

REBOL的檔案表示方式,依照下面的規則:

  1. 開頭使用「%」
  2. 目錄的分隔符號使用「/」
  3. 中間如果有特殊字元,則使用「%」後面接著兩個十六進位數字,代表該特殊字元的編碼。以這裡的例子來說,空白的值,在ASCII編碼是十六進位的20。所以寫成%20
  4. 如果是目錄,則最後是「/」
  5. 如果是絕對路徑,則開頭的「%」後面會接著一個「/」。如果是相對路徑,則開頭的「%」後面不會出現一個「/」。

【檔案的轉換】

如果你對於上面描述的檔案規則覺得不習慣,可以利用to-local-file,將what-dir傳出的檔案轉成作業系統慣用的格式,作法如下:

>> to-local-file what-dir
== "C:\Documents 20and 20Settings\Jerry Tsai\桌面\"

因為to-local-file的傳出值是字串不是檔案,所以前後加上雙引號「"」。有一個函數和to-local-file做的事剛好事相反的,可以把作業系統檔案字串,轉成REBOL檔案,此函數名為to-rebol-file,範例如下:

>> to-rebol-file "C:\Program Files\"
== %/C/Program%20Files/

【改變目錄】

你可以使用change-dir(或cd)函數,改變目前的目錄,例如:

>> cd %/c/
>> pwd
== %/c/

你也可以利用相對路徑的表示方式(也就是開頭的「%」後面不寫「/」),例如:

>> pwd
== %/c/
>> cd %Program%20Files
>> pwd
== %/C/Program%20Files/

有兩個特殊的相對路徑表示方式:「%.」表示目前的目錄,「%..」表示往上一個目錄。依此類推,「%../../表示往上兩層目錄」。下面是一個範例:

>> pwd
== %/C/Program%20Files/
>> cd %..
>> pwd
== %/c/

【製造目錄】

你可以使用make-dir(或mkdir)函數,製作新的目錄,例如:

>> mkdir %abc/

這表示在目前的目錄下,建立一個abc目錄。再看一個例子:

>> mkdir/deep %/c/rebol/my-script/

這裡的mkdir後面緊接著出現「/deep」,意思是:在建立此目錄的過程中,如果有其他的目錄尚未建立,就一併建立。所以如果%/c/rebol/尚未存在,就會先建立%/c/rebol/,然後再建立%/c/rebol/my-script/。

像這種函數後面加上的修飾,我們稱為refinement。

【列出檔案】

你可以使用list-dir(或ls)函數,將某目錄下的檔案列出來,例如:

>> ls %/c/

如果後面沒有寫目錄,預定就是目前的目錄(%.),例如:

>> ls

list-dir(與ls)可以使用下面的refinement:
/l:表示每個檔案用一行顯示
/f:只列出檔案,不列出目錄
/d:只列出目錄,不列出檔案
/r:列出此目錄以及底下所有子孫目錄內的檔案

例如:

>> ls/l/r

當同時使用兩個以上的refinement時,順序無所謂,所以「ls/l/r」和「ls/r/l」是完全一樣的效果。

【取得檔案資訊】

你可以利用「modified?」取得檔案最後修改時間,用「size?」取得檔案大小,用「dir?」得知否為目錄(而非檔案)。例如:

>> modified? %/c/rebol/core.exe
== 5-Mar-2008/6:31
>> size? %/c/rebol/core.exe
== 219136
>> dir? %core.exe
== false

2 則留言:

匿名 提到...

询问一下,怎么用rebol来执行系统命令呢?类似perl语言中的system和exec。

蔡學鏞 / Jerry Tsai 提到...

REBOL 2.x有一個函數,名為call。