啟動與離開 Octave

一般來說 Octave 的啟動方式是直接執行 octave,當啟動了之後 Octave 會等待使用者輸入指令以便執行,而執行完後又會繼續等待下一個指令,直到使用者輸入離開 Octave 的指令為止。

離開 Octave 可以使用 exit()quit() 函數:

exit (status)
quit (status)

exit()quit() 函數用來離開 Octave,兩個函數功能相同,status 參數是指定 Octave 結束時回傳給作業系統的值,若不指定則預設為0

atexit (fcn)
atexit (fcn, flag)

設定離開 Octave 時執行的函數,例如:

function last_words ()
    disp ("Bye bye");
endfunction
atexit ("last_words");

這裡自行定義一個函數 last_words(),並呼叫 atexit() 函數,這樣在 Octave 離開時,就會自動執行 last_words() 函數。

atexit() 函數會將 fcn 所指定的函數加入一個列表中,在 Octave 離開時執行此列表中的函數,也就是說可以指定多個函數一並在 Octave 離開時執行,而 flag 參數是用來指定將 fcn 加入或移除列表,若 flag 設為 true 則為加入,設為 false 則為移除。

atexit() 從列表中移除函數時,只會將第一個符合的函數移除,若是一個函數加入了好幾次,在移除時也要移除好幾次。

線上說明文件(Online Help)

Octave 官方完整的線上參考手冊可以使用 doc 指令來查閱:

doc [function_name]

doc 指令會使用 GNU Info 瀏覽器打開 Octave 官方線上參考手冊,function_name 參數用來指定要查看的章節,例如:

doc rand

若是不指定 function_name,則會顯示文件最開頭的目錄:

doc

而由一些由使用者發展的函數與變數亦可以使用 help 指令查詢其說明與使用方式:

help [name]

help 指令用來查詢一些由使用者發展的函數與變數,name 為指定的函數或是主題名稱,例如查詢 plot 函數的說明與使用方式:

help plot

name 也可以直接指定為運算子,例如乘法運算子的說明:

help *

help 查詢逗號(,)與分號(;)運算子時,因為這兩個運算子是指令的分隔運算子,無法直接放在指令中,必須使用 help commahelp semicolon 替代。

若要搜尋線上手冊可以使用 lookfor 指令:

lookfor str
lookfor -all str
[func, helpstring] = lookfor (str)
[func, helpstring] = lookfor (-all, str)

lookfor 指令是用來在所有的函數說明中尋找 str(不分大小寫),預設 lookfor 只會搜尋每個函數說明的第一句,若是要在完整的函數說明中尋找,則必須加上 -all 參數。

lookfor 預設是搜尋函數的第一句說明,標準的 Octave 函數會將最重要的說明與關鍵字放在函數說明的第一句,但是有一些其他使用者自行撰寫的函數不一定會遵守此規定,因此在搜尋非官方的函數時,最好加上 -all 參數搜尋全部的函數說明。

例如想搜尋 plot 相關的函數:

lookfor plot

這會將所有包含 plot 字樣的函數列出來。

命令列編輯(Command Line Editing)

Octave 使用 GNU Readline Library 提供命令列(command-line)的操控與歷史紀錄功能,這裡只介紹一般性的功能,進階的使用技巧可以參考 GNU Readline Library。

有許多命令列的編輯功能是透過控制字元(control characters)來操作,例如 Ctrl + a 會將輸入游標移動到行首,操作方式是先按住鍵盤上的 Ctrl 鍵,在按下 a 鍵,其餘的控制字元也是以類似的方式操作。

另一種命令列的操作方式是透過 Meta 字元(Meta characters),例如 Meta + u 的輸入的方式是按住 Meta 鍵再按下 u 鍵,在一些系統中沒有 Meta 鍵,則使用 Esc 鍵,即按一次 Esc 鍵(不用按住)再輸入 u

移動游標(Cursor Motion)

以下這些指令可以用來移動游標:

  • Ctrl + b:將游標向後移動一個字元,在大部份的系統中可以使用左鍵替代。
  • Ctrl + f:將游標向前移動一個字元,在大部份的系統中可以使用右鍵替代。
  • Del:將游標左邊的一個字元刪除。
  • Ctrl + d:將游標所在的一個字元刪除。
  • Meta + f:將游標向前移動一個字(word)。
  • Meta + b:將游標向後移動一個字(word)。
  • Ctrl + a:將游標移動到行首。
  • Ctrl + e:將游標移動到行尾。
  • Ctrl + l:清除螢幕,只留下最後一行 Octave 提示符號。
  • Ctrl + _Ctrl + /:復原最後一次的編輯動作。
  • Meta + r:復原本行指令的所有編輯動作。

以上是在輸入指令時最常用的編輯指令。

Ctrl 主要用於字元(characters)的操作,而 Meta 主要用於字(word)的操作,例如 Ctrl + f 是向後移動一個字元,而 Meta + f 是向後移動一個字。

在 Octave 中也有專門的函數可以清除螢幕:

clc()
home()

clc()home() 兩個函數功能相同,都是將螢幕清除,並將游標移至第一行,這些函數可以用在 Octave 程式中。

剪下與貼上(Killing and Yanking)

Octave 的命令列支援文字的剪下與貼上,以下是相關的指令:

  • Ctrl + k:剪下從目前游標所在位置到行尾的所有文字。
  • Meta + d:剪下從目前游標所在位置向後到字的結尾之間的所有文字,若是游標剛好在字與字之間,則將下一個字結尾之前的文字剪下。
  • Meta + Del:剪下從目前游標所在位置向前到字的開頭之間的所有文字,若是游標剛好在字與字之間,則將上一個字開頭之後的文字剪下。
  • Ctrl + w:剪下從目前游標所在位置向前到前一個空白字元之間的所有文字。

Ctrl + wMeta + Del 是不同的,因為字的邊界不一定是空白字元。

Octave 會將剪下的文字儲存在一個 kill-ring 緩衝區中,而 kill-ring 中的資料可以使用下面的指令貼上:

  • Ctrl + y:貼上 kill-ring 中最頂端的文字。
  • Meta + y:旋轉 kill-ring 並貼上最頂端的文字,這個指令只有在上一個指令是 Ctrl + yMeta + y 時可以使用。

kill-ring 可以想像是一個會轉動的環狀緩衝區,每次呼叫 Meta + y 就會將 kill-ring 轉動一格,並貼上最頂端的文字。以上兩個指令常常需要配合使用,若要貼上的文字不是最後一次剪下的,則必須先使用 Ctrl + y 貼上最後一次剪下的文字,再用 Meta + y 選取要貼上的文字。

Ctrl + k 代表剪下而 Ctrl + y 代表貼上是來自於於英文的 killing 與 yanking。

編輯文字

以下指令用於編輯指令列的文字:

  • Ctrl + qCtrl + v:輸入下一個鍵入的字元,通常用在輸入特殊字元的時候。
  • Meta + Tab:輸入 Tab 字元。
  • Ctrl + t:將游標之前的一個字元連同游標向後移動,若是游標已經在行尾,則將行尾的最後兩個字元對調。
  • Meta + t:將游標的前一個字(word)連同游標向後移動。
  • Meta + u:將游標所在位置到目前的字(word)的結尾之間所有的字元轉為大寫。
  • Meta + l:將游標所在位置到目前的字(word)的結尾之間所有的字元轉為小寫。
  • Meta + c:將游標所在位置或之後的第一個字元轉為大寫,並將游標移動至該字(word)的結尾處。

自動補齊(Completion)

以下的指令提供自動補齊的功能:

  • Tab:將游標之前的文字自動補齊(completion),Octave 可以自動補齊指令與變數名稱。
  • Meta + ?:列出所有可用於游標之前的文字自動補齊,在大部分的系統中可用連續兩個 Tab 替代。

歷史紀錄(History)

Octave 會將使用者所輸入的每一行指令記錄下來,以便讓使用者可以查詢與執行已經執行過得指令,而不用再重新輸入一次,而當離開時 Octave 會將最近輸入的指令自動儲存在紀錄檔中,最多可以儲存的指令數量是由 history_size 這個變數來設定,而紀錄檔的位置則是由 history_file 變數來指定。

下面是一些瀏覽與搜尋指令紀錄的指令:

  • Enter:不管游標在哪個位置,按下 Enter 鍵之後,若是輸入的指令不是空字串,Octave 就會執行所輸入的指令並將此指令加入指令紀錄中。
  • Ctrl + p:顯示上一個指令紀錄,在大部分的系統中可用上鍵替代。
  • Ctrl + n:顯示下一個指令紀錄,在大部分的系統中可用下鍵替代。
  • Meta + <:顯示第一個指令紀錄。
  • Meta + >:顯示最後一個指令紀錄,也就是目前輸入的指令。
  • Ctrl + r:從目前在指令紀錄中的位置向前搜尋,支援 incremental search。
  • Ctrl + s:從目前在指令紀錄中的位置向後搜尋,支援 incremental search。

除了使用鍵盤指令操控指令紀錄外,Octave 也提供了一些指令可以查閱與編輯指令紀錄:

history [options]

若是不佳任何參數,history 會顯示目前的指令紀錄,亦即最近執行過的指令,其可用的參數如下:

  • -w file:將目前的指令紀錄儲存至檔案 file 中,若是沒有指定 file 參數,則會儲存至預設的紀錄檔,在一般的 UNIX 系統中預設是 "~/.octave_hist"
  • -r file:從紀錄檔中載入指令紀錄,覆蓋掉目前使用中的指令紀錄,若是沒有指定 file 參數,則會由預設的紀錄檔中讀取,在一般的 UNIX 系統中預設是 "~/.octave_hist"
  • n:只顯示最近 n 筆指令紀錄。
  • -q:不要顯示行號。

例如顯示最近 10 筆指令紀錄,而不要顯示行號:

history -q 10
edit_history [first] [last]

此指令會開啟指定的編輯器(由 EDITOR 變數指定)編輯指令紀錄,在編輯指令時 Octave 會將要編輯的指令儲存至一個暫存檔中,而編輯完成後 Octave 會自動執行此暫存檔中的指令,這個功能在自行定義函數時非常有用,比起直接在命令列中定義函數方便許多。

Octave 會在編輯器關閉之後自動執行站存檔中的指令,若想要取消則將檔案中的內容清空即可。

edit_history 可以接受兩個參數,指定要編輯的指令紀錄範圍,例如要編輯從第 3 行到第 8 行的指令紀錄:

edit_history 3 8

若是只指定一個參數,就會只編輯該行指令紀錄,例如編輯第 5 行:

edit_hostory 5

若是不加任何參數,則會編輯最後一行指令紀錄。

run_history [first] [last]

edit_history 類似,但直接執行指定範圍的指令而不開啟編輯器。例如執行第 3 行到第 8 行的指令紀錄:

run_history 3 8

提示符號(Prompt)

Octave 預設的提示符號是 octave:##>## 代表行號,Octave 允許使用者自訂提示符號,以下是一些可以用在自訂提示符號的變數:

  • \t:時間。
  • \d:日期。
  • \n:Begins a new line by printing the equivalent of a carriage return followed by a line feed.
  • \s:Octave 程式名稱,通常是 “octave”。
  • \w:目前的工作目錄名稱。
  • \W:不含路徑的目前工作目錄名稱。
  • \u:目前的使用者名稱。
  • \h:簡短的主機名稱。
  • \H:完整的主機名稱。
  • \#:行號,從開啟 Octave 時開始計算。
  • \!:指令紀錄中的行號,與 # 的差異在於 Octave 開啟時所載入的指令紀錄行數。
  • \$:若 UID 為 0,則顯示 #,否則顯示 $
  • \nnn:以八進位 nnn 指定字元。
  • \\:顯示反斜線。

Octave 的提示符號可以透過下列函數查詢與變更:

val = PS1()
old_val = PS1(new_val)

PS1() 用來查詢或設定 Octave 主要的提示符號,當 Octave 準備好可以讓使用者輸入指令時,就會顯示主要提示符號,預設是 "\s:\#> ",若要更改則使用 new_val 參數指定新的提示符號,例如:

PS1 ("\\t[\\#]> ")

這會將提示符號更改為類似 15:48:46[20]> 這個樣子。

若是使用雙引號輸入反斜線,則需要將反斜線重複一次,若是使用單引號則不需要,例如:PS1 ('\t[\#]> ')

val = PS2()
old_val = PS2(new_val)

PS2() 用來查詢或設定 Octave 次要的提示符號,當使用者無法在一行會輸入所有的指令時,第二行之後的提示符號會顯示次要提示符號,更改方式與 PS1() 類似,預設為 ">"

val = PS4()
old_val = PS4(new_val)

PS4() 用來查詢或設定 echo 輸出的前置字元(prefix),主要用於 echo 指令,預設是 "+ "

Diary 與 Echo

Octave 的 diary 功能可以將使用者所有的操作紀錄至檔案中,包含所有的輸入的指令與輸出的結果:

diary options

diary 指令可以將所有輸入的指令與其所產生的輸出訊息記錄至檔案中,就像螢幕上所看到的一樣,可用的參數有:

  • on:開始紀錄。
  • off:停止紀錄。
  • file:檔案名稱。

有時候我們會想看 Octave 執行到函數或指令稿(script)中的哪一個部分,例如在除錯的時候,可以使用 echo 函數:

echo options

echo 可設定使否顯示函數或指令稿(script)中正在執行的指令,可用的參數有:

  • on:開啟指令稿的顯示功能。
  • off:關閉指令稿的顯示功能。
  • on all:開啟函數與指令稿的顯示功能。
  • off all:關閉函數與指令稿的顯示功能。
val = echo_executing_commands ()
old_val = echo_executing_commands (new_val)

查詢或設定 Octave 內部用來控制 echo 的變數,此數值可以是以下數值任意的總和:

  • 1:顯示從指令稿檔案(script files)中讀取而執行的指令。
  • 2:顯示在函數中執行的指令。
  • 4:顯示從指令列讀取而執行的指令。

例如要開啟函數與指令稿的顯示功能(即 echo on all),則將此數值設定為 31 + 2

echo_executing_commands (3)

事實上此變數是依照第幾個位元被設定而決定哪個功能被開啟,1 的二進位是 001b(第一個位元被設定),2010b(第二個位元被設定),3 則是 100b(第三個位元被設定)。而 1 + 2 = 3,是 011b(第一個與第二個位元被設定)。

錯誤訊息(Error Messages)

Octave 中的錯誤訊息主要分為語法錯誤(parse error)與執行時錯誤(run-time error)兩種。 語法錯誤(parse error)

在使用 Octave 時常常會碰到輸入的指令語法錯誤導致 Octave 無法執行的問題,此時 Octave 會出現錯誤訊息,並且標明錯誤出現的位置,例如:

3 *** 2

會出現錯誤訊息:

parse error:
syntax error
>>> 3 *** 2
^

Octave 會使用 ^ 符號將錯誤出現的位置標示出來,在 Octave 中的運算子只有 **,沒有 ***,因此出現第三個 * 時,Octave 無法解讀所以回報錯誤。

執行時錯誤(run-time error)

此種錯誤又稱為 evaluation error,發生在程式實際執行的時候,例如:

自行定義個函數 f(x)

function y = f(x)
    y = x^2
endfunction

呼叫此函數:

f()

產生的錯誤訊息:

error: `x’ undefined near line 2 column 9
error: called from:
error: f at line 2, column 7

此錯誤訊息是由最內層的錯誤發生處所產生的,其所提供的 trackback 可以協助使用者找出錯誤的位置。第一行錯誤訊息表示在程式第 2 行的第 9 個字元的位置有個 x 變數沒有定義,若是錯誤發生在函數中,則行號是由函數定義檔的開頭起算,若是發生在函數之外,則會以 Octave 輸入指令的行號為準(這個行號預設會顯示在提示符號中)。

第二行與第三行錯誤訊息表示此錯誤發生在 f() 函數之中,若是 f() 函數是被另一個函數所呼叫的,例如 g() 函數,則錯誤訊息還會多出一行:

error: g at line 2, column 16

藉由這個函數呼叫的列表,使用者可以快速的追蹤錯誤發生的經過。