檢視原始碼 shell (stdlib v6.2)
Erlang shell。
shell 是一個使用者介面程式,用於輸入運算式序列。這些運算式會被求值並返回一個值。shell 提供類似 Emacs 的快捷鍵組合來編輯目前行的文字。如需所有可用快捷鍵的列表,請參閱 ERTS 使用者指南中的 tty - 命令列介面。您也可以變更快捷鍵以更符合您的偏好,請參閱 edlin - shell 中的行編輯器。
歷史機制會儲存先前的指令及其值,之後可以在指令中使用這些資訊。要儲存多少指令和結果可以由使用者決定,可以互動式地透過呼叫 history/1
和 results/1
,或設定 STDLIB 應用程式的應用程式組態參數 shell_history_length
和 shell_saved_results
來決定。透過設定 Kernel 應用程式的應用程式組態參數 shell_history
,shell 歷史記錄可以儲存到磁碟中。
shell 使用輔助程序來評估指令,以保護歷史機制免受例外情況的影響。預設情況下,當發生例外情況時,評估程序會被終止,但可以透過呼叫 catch_exception/1
或設定 STDLIB 應用程式的應用程式組態參數 shell_catch_exception
來變更此行為。另請參閱下面的範例。
在使用者運算式中產生的變數綁定和本機程序字典變更會被保留,並且這些變數可以在後續指令中用來存取它們的值。這些綁定也可以被遺忘,以便這些變數可以重複使用。
特殊的 shell 指令都具有 (本機) 函數呼叫的語法。它們會被評估為一般的函數呼叫,並且可以在一個運算式序列中使用多個指令。
如果 shell 無法識別某個指令 (本機函數呼叫),則會先嘗試在模組 user_default
中尋找該函數,您可以在其中放置自訂的本機指令。如果找到,則會評估該函數,否則會嘗試在模組 shell_default
中評估該函數。必須明確載入模組 user_default
。
shell 也允許使用者啟動多個並行作業。一個作業可以視為一組可以與 shell 通訊的程序。
shell 中有一些對讀取和列印記錄的支援。在編譯期間,記錄運算式會被轉換為元組運算式。在執行階段,不知道元組是否表示記錄,並且編譯器使用的記錄定義在執行階段不可用。因此,為了讀取記錄語法並在可能時將元組列印為記錄,記錄定義必須由 shell 本身維護。
下面說明用於讀取、定義、遺忘、列出和列印記錄的 shell 指令。請注意,每個作業都有自己的一組記錄定義。為了方便起見,每次啟動新作業時都會讀取模組 shell_default
和 user_default
(如果已載入) 中的記錄定義。例如,將以下行新增到 user_default
會使 file_info
的定義在 shell 中隨時可用
-include_lib("kernel/include/file.hrl").
shell 在兩種模式下執行
一般 (可能受限)
模式,可以在其中編輯指令並評估運算式- 作業控制模式,
JCL
,可以在其中啟動、終止、分離和連接作業
只有目前連接的作業可以與 shell 「交談」。
Shell 指令
以下指令是始終可用的內建 shell 指令。在大多數系統中,c
模組中列出的指令也可以在 shell 中使用。
b()
- 列印目前的變數綁定。f()
- 移除所有變數綁定。f(X)
- 移除變數X
的綁定。注意
如果變數綁定中儲存了很大的值,您必須同時呼叫
f(X)
和呼叫history(0)
或results(0)
以釋放該記憶體。h()
- 列印歷史記錄清單。history(N)
- 將歷史記錄清單中要保留的先前指令數設定為N
。傳回先前的數字。預設值為 20。results(N)
- 將歷史記錄清單中要保留的先前指令結果數設定為N
。傳回先前的數字。預設值為 20。e(N)
- 重複指令N
,如果N
為正數。如果為負數,則會重複第N
個先前的指令 (也就是說,e(-1)
會重複先前的指令)。v(N)
- 在目前的指令中使用指令N
的傳回值,如果N
為正數。如果為負數,則會使用第N
個先前指令的傳回值 (也就是說,v(-1)
會使用先前指令的值)。help()
- 評估shell_default:help()
。h(Module, Function)
- 如果可用,則在 shell 中列印Module:Function
的文件。ht(Module, Type)
- 如果可用,則在 shell 中列印Module:Type
的文件。hcb(Module, Callback)
- 如果可用,則在 shell 中列印Module:Callback
的文件。c(Mod)
- 評估shell_default:c(Mod)
。這會編譯和載入模組Mod
,並在必要時清除舊版本的程式碼。Mod
可以是模組名稱或來源檔案路徑,有或沒有.erl
副檔名。catch_exception(Bool)
- 設定評估程序的例外處理。傳回先前的例外處理。預設值 (false
) 是在發生例外情況時終止評估程序,這會導致 shell 建立新的評估程序。當例外處理設定為true
時,評估程序會繼續執行。這表示,例如,連接到評估程序的連接埠和 ETS 表格以及程序會在例外情況中存留。rd(RecordName, RecordDefinition)
- 在 shell 中定義記錄。RecordName
是一個原子,而RecordDefinition
列出欄位名稱和預設值。通常透過使用下面說明的rr/1,2,3
指令來讓 shell 知道記錄定義,但有時在執行時定義記錄會很方便。rf()
- 移除所有記錄定義,然後從模組shell_default
和user_default
(如果已載入) 讀取記錄定義。傳回已定義記錄的名稱。rf(RecordNames)
- 移除選取的記錄定義。RecordNames
是一個記錄名稱或記錄名稱清單。若要移除所有記錄定義,請使用'_'
。rl()
- 列印所有記錄定義。rl(RecordNames)
- 列印選取的記錄定義。RecordNames
是一個記錄名稱或記錄名稱清單。rp(Term)
- 使用 shell 已知的記錄定義列印術語。列印所有Term
;深度不受限制,就像列印傳回值時一樣。rr(Module)
- 從模組的 BEAM 檔案讀取記錄定義。如果 BEAM 檔案中沒有記錄定義,則會改為尋找並讀取來源檔案。傳回已讀取記錄定義的名稱。Module
是一個原子。rr(Wildcard)
- 從檔案讀取記錄定義。取代讀取之任何記錄名稱的現有定義。Wildcard
是在filelib
中定義的萬用字串,但不是原子。rr(WildcardOrModule, RecordNames)
- 從檔案讀取記錄定義,但捨棄RecordNames
(記錄名稱或記錄名稱清單) 中未提及的記錄名稱。rr(WildcardOrModule, RecordNames, Options)
- 從檔案讀取記錄定義。編譯器選項{i, Dir}
、{d, Macro}
和{d, Macro, Value}
會被識別並用於設定包含路徑和巨集定義。若要讀取所有記錄定義,請使用'_'
作為RecordNames
的值。lf()
- 輸出本機定義的函數,如果存在,則輸出函數規格。lt()
- 輸出本機定義的類型。lr()
- 輸出本機定義的記錄。ff()
- 忘記本機定義的函數 (包括函數規格,如果存在)。ff({FunName,Arity})
- 忘記一個本地定義的函式(包含函式規格,如果存在)。其中FunName
是函式名稱,以原子 (atom) 表示,而Arity
是一個整數。tf()
- 忘記本地定義的型別。tf(Type)
- 忘記本地定義的型別,其中Type
是型別名稱,以原子 (atom) 表示。fl()
- 忘記本地定義的函式、型別和記錄。save_module(FilePath)
- 將所有本地定義的函式、型別和記錄儲存到模組檔案中,其中FilePath
應包含檔案的路徑和模組名稱,並帶有.erl
後綴。範例:
src/my_module.erl
範例
以下範例是與 Shell 的一段長對話。以 >
開頭的指令是輸入到 Shell 的內容。其他行則是來自 Shell 的輸出。
strider 1> erl
Erlang (BEAM) emulator version 5.3 [hipe] [threads:0]
Eshell V5.3 (abort with ^G)
1> Str = "abcd".
"abcd"
指令 1 設定變數 Str
為字串 "abcd"
。
2> L = length(Str).
4
指令 2 設定 L
為字串 Str
的長度。
3> Descriptor = {L, list_to_atom(Str)}.
{4,abcd}
指令 3 建立元組 Descriptor
,並評估 BIF list_to_atom/1
。
4> L.
4
指令 4 印出變數 L
的值。
5> b().
Descriptor = {4,abcd}
L = 4
Str = "abcd"
ok
指令 5 評估內部 Shell 指令 b()
,這是 "bindings" 的縮寫。這會印出目前的 Shell 變數及其綁定。ok
在最後是函式 b()
的回傳值。
6> f(L).
ok
指令 6 評估內部 Shell 指令 f(L)
("forget" 的縮寫)。變數 L
的值被移除。
7> b().
Descriptor = {4,abcd}
Str = "abcd"
ok
指令 7 印出新的綁定。
8> f(L).
ok
指令 8 沒有效果,因為 L
沒有值。
9> {L, _} = Descriptor.
{4,abcd}
指令 9 對 Descriptor
執行模式比對操作,將新值綁定到 L
。
10> L.
4
指令 10 印出 L
的目前值。
11> {P, Q, R} = Descriptor.
** exception error: no match of right hand side value {4,abcd}
指令 11 嘗試將 {P, Q, R}
與 Descriptor
比對,後者為 {4, abc}
。比對失敗,且沒有任何新變數被綁定。以 "** exception error:
" 開頭的輸出不是表達式的值(因為表達式評估失敗而沒有值),而是系統印出的警告,通知使用者發生錯誤。其他變數(L
、Str
等)的值保持不變。
12> P.
* 1:1: variable 'P' is unbound
13> Descriptor.
{4,abcd}
指令 12 和 13 顯示 P
未綁定,因為上一個指令失敗,並且 Descriptor
沒有改變。
14>{P, Q} = Descriptor.
{4,abcd}
15> P.
4
指令 14 和 15 顯示正確的比對,其中 P
和 Q
被綁定。
16> f().
ok
指令 16 清除所有綁定。
接下來的幾個指令假設 test1:demo(X)
定義如下
demo(X) ->
put(aa, worked),
X = 1,
X + 10.
17> put(aa, hello).
undefined
18> get(aa).
hello
指令 17 和 18 設定並檢查處理程序字典中項目 aa
的值。
19> Y = test1:demo(1).
11
指令 19 評估 test1:demo(1)
。評估成功,且在處理程序字典中所做的變更對 Shell 可見。可以在指令 20 中看到字典項目 aa
的新值。
20> get().
[{aa,worked}]
21> put(aa, hello).
worked
22> Z = test1:demo(2).
** exception error: no match of right hand side value 1
in function test1:demo/1
指令 21 和 22 將字典項目 aa
的值變更為 hello
並呼叫 test1:demo(2)
。評估失敗,且在發生錯誤之前,在 test1:demo(2)
中對字典所做的變更被捨棄。
23> Z.
* 1:1: variable 'Z' is unbound
24> get(aa).
hello
指令 23 和 24 顯示 Z
未被綁定,且字典項目 aa
保留其原始值。
25> erase(), put(aa, hello).
undefined
26> spawn(test1, demo, [1]).
<0.57.0>
27> get(aa).
hello
指令 25、26 和 27 顯示在背景評估 test1:demo(1)
的效果。在此情況下,表達式會在新產生的處理程序中評估。在處理程序字典中所做的任何變更都僅限於新產生的處理程序,因此 Shell 無法看到。
28> io:format("hello hello\n").
hello hello
ok
29> e(28).
hello hello
ok
30> v(28).
ok
指令 28、29 和 30 使用 Shell 的歷史記錄功能。指令 29 重新評估指令 28。指令 30 使用指令 28 的值(結果)。對於純函式(沒有副作用的函式),結果是相同的。對於有副作用的函式,結果可能會不同。
接下來的幾個指令顯示一些記錄操作。假設 ex.erl
定義一個記錄如下
-record(rec, {a, b = val()}).
val() ->
3.
31> c(ex).
{ok,ex}
32> rr(ex).
[rec]
指令 31 和 32 編譯檔案 ex.erl
並讀取 ex.beam
中的記錄定義。如果編譯器沒有在 BEAM 檔案上輸出任何記錄定義,rr(ex)
會嘗試改為從原始程式碼檔案讀取記錄定義。
33> rl(rec).
-record(rec,{a,b = val()}).
ok
指令 33 印出名為 rec
的記錄定義。
34> #rec{}.
** exception error: undefined shell command val/0
指令 34 嘗試建立一個 rec
記錄,但由於函式 val/0
未定義而失敗。
35> #rec{b = 3}.
#rec{a = undefined,b = 3}
指令 35 顯示解決方法:明確將值指派給無法以其他方式初始化的記錄欄位。
36> rp(v(-1)).
#rec{a = undefined,b = 3}
ok
指令 36 使用 Shell 維護的記錄定義印出新建立的記錄。
37> rd(rec, {f = orddict:new()}).
rec
指令 37 直接在 Shell 中定義記錄。此定義會取代從檔案 ex.beam
讀取的定義。
38> #rec{}.
#rec{f = []}
ok
指令 38 使用新的定義建立記錄,並印出結果。
39> rd(rec, {c}), A.
* 1:15: variable 'A' is unbound
40> #rec{}.
#rec{c = undefined}
ok
指令 39 和 40 顯示記錄定義會以副作用方式更新。指令的評估失敗,但 rec
的定義已執行。
對於下一個指令,假設 test1:loop(N)
定義如下
loop(N) ->
io:format("Hello Number: ~w~n", [N]),
loop(N+1).
41> test1:loop(0).
Hello Number: 0
Hello Number: 1
Hello Number: 2
Hello Number: 3
User switch command
--> i
--> c
.
.
.
Hello Number: 3374
Hello Number: 3375
Hello Number: 3376
Hello Number: 3377
Hello Number: 3378
** exception exit: killed
指令 41 評估 test1:loop(0)
,這會使系統進入無限迴圈。此時使用者輸入 ^G
(Control G),這會暫停目前處理程序的輸出(該處理程序卡在迴圈中),並啟動 JCL
模式。在 JCL
模式中,使用者可以啟動和停止作業。
在此特定情況下,指令 i
("interrupt") 會終止迴圈程式,而指令 c
會再次連線到 Shell。由於處理程序在我們終止它之前在背景中執行,因此在顯示訊息 "** exception exit: killed
" 之前會發生更多輸出。
42> E = ets:new(t, []).
#Ref<0.1662103692.2407923716.214192>
指令 42 建立一個 ETS 表格。
43> ets:insert({d,1,2}).
** exception error: undefined function ets:insert/1
指令 43 嘗試將元組插入到 ETS 表格中,但遺失第一個參數(表格)。此例外狀況會終止評估器處理程序。
44> ets:insert(E, {d,1,2}).
** exception error: argument is of wrong type
in function ets:insert/2
called as ets:insert(16,{d,1,2})
指令 44 更正了錯誤,但 ETS 表格已毀損,因為它由終止的評估器處理程序擁有。
45> f(E).
ok
46> catch_exception(true).
false
指令 46 將評估器處理程序的例外狀況處理設定為 true
。也可以在啟動 Erlang 時使用 erl -stdlib shell_catch_exception true
設定例外狀況處理。
47> E = ets:new(t, []).
#Ref<0.1662103692.2407923716.214197>
48> ets:insert({d,1,2}).
* exception error: undefined function ets:insert/1
指令 48 犯了與指令 43 相同的錯誤,但這次評估器處理程序繼續運作。輸出開頭的單星號表示例外狀況已被捕獲。
49> ets:insert(E, {d,1,2}).
true
指令 49 成功將元組插入到 ETS 表格中。
50> ets:insert(#Ref<0.1662103692.2407923716.214197>, {e,3,4}).
true
指令 50 將另一個元組插入到 ETS 表格中。這次,第一個參數是表格識別碼本身。Shell 可以剖析具有 PID (<0.60.0>
)、埠 (#Port<0.536>
)、參考 (#Ref<0.1662103692.2407792644.214210>
) 和外部函式 (#Fun<a.b.1>
) 的指令,但除非可以在執行中的系統中建立對應的 PID、埠、參考或函式,否則指令會失敗。
51> halt().
strider 2>
指令 51 結束 Erlang 執行階段系統。
JCL 模式
當 Shell 啟動時,它會啟動單一評估器處理程序。此處理程序以及它產生的任何本地處理程序都稱為 job
。只有目前的作業(稱為 connected
)可以執行標準 I/O 操作。所有其他作業(稱為 detached
)如果嘗試使用標準 I/O,則會被 blocked
。
所有不使用標準 I/O 的作業都以正常方式執行。
Shell 跳脫鍵 ^G
(Control G) 會分離目前的作業並啟動 JCL
模式。JCL
模式提示字元為 "-->"
。如果在提示字元中輸入 "?"
,則會顯示以下說明訊息
--> ?
c [nn] - connect to job
i [nn] - interrupt job
k [nn] - kill job
j - list all jobs
s [shell] - start local shell
r [node [shell]] - start remote shell
q - quit erlang
? | h - this message
JCL
指令具有以下含義
c [nn]
- 連接到作業編號<nn>
或目前的作業。標準 Shell 會恢復。目前作業使用標準 I/O 的操作會與使用者對 Shell 的輸入交錯。i [nn]
- 停止作業編號nn
或目前作業的目前評估器處理程序,但不會終止 Shell 處理程序。因此,任何變數綁定和處理程序字典都會保留,且可以再次連接作業。此指令可用於中斷無限迴圈。k [nn]
- 終止作業編號nn
或目前的作業。作業中所有產生的處理程序都會被終止,前提是它們尚未評估group_leader/1
BIF,且位於本地電腦上。在遠端節點上產生的處理程序不會被終止。j
- 列出所有作業。會印出所有已知作業的清單。目前的作業名稱會加上 '*' 字首。s
- 啟動新的作業。這會指派新的索引[nn]
,可以在參考中使用。s [shell]
- 啟動新的作業。這會指派新的索引[nn]
,可以在參考中使用。如果指定選用的引數shell
,則會假設它是一個實作替代 Shell 的模組。r [node]
- 在node
上啟動遠端作業。這用於分散式 Erlang,以便允許在一個節點上執行的 Shell 控制在網路節點上執行的一些應用程式。如果指定選用的引數shell
,則會假設它是一個實作替代 Shell 的模組。q
- 結束 Erlang。請注意,如果 Erlang 是以忽略中斷的系統旗標+Bi
啟動,則此選項會停用(例如,在執行限制 Shell 時,這會很有用,請參閱下一節)。?
- 顯示以上說明訊息。
Shell 跳脫行為可以透過 STDLIB 應用程式變數 shell_esc
變更。變數的值可以是 jcl
(erl -stdlib shell_esc jcl
) 或 abort
(erl -stdlib shell_esc abort
)。第一個選項會將 ^G
設定為啟動 JCL
模式(這也是預設行為)。後者會將 ^G
設定為終止目前的 Shell 並啟動新的 Shell。當 shell_esc
設定為 abort
時,無法叫用 JCL
模式。
如果您希望 Erlang 節點從一開始就具有遠端作業 (而不是預設的本地作業),請使用旗標 -remsh
啟動 Erlang,例如,erl -remsh other_node@other_host
受限 Shell
Shell 可以以受限模式啟動。在此模式下,只有在允許的情況下,Shell 才會評估函數呼叫。此功能使我們能夠,例如,防止使用者從提示符號意外呼叫可能會損害正在執行的系統的函數(與系統標誌 +Bi
結合使用時很有用)。
當受限 Shell 評估表達式並遇到函數呼叫或運算子應用時,它會呼叫回呼函數(並提供有關相關函數呼叫的資訊)。此回呼函數會回傳 true
以讓 Shell 繼續進行評估,或回傳 false
以中止評估。使用者可以實作兩個可能的回呼函數:
local_allowed(Func, ArgList, State) -> {boolean(),NewState}
此函數用於判斷是否允許呼叫具有引數
ArgList
的本地函數Func
。non_local_allowed(FuncSpec, ArgList, State) -> {boolean(),NewState} | {{redirect,NewFuncSpec,NewArgList},NewState}
此函數用於判斷是否允許呼叫具有引數
ArgList
的非本地函數FuncSpec
({Module,Func}
或 fun)。回傳值{redirect,NewFuncSpec,NewArgList}
可用於讓 Shell 評估與FuncSpec
和ArgList
指定的函數不同的其他函數。
這些回呼函數是從 erl_eval
手冊頁中描述的本地和非本地評估函數處理常式中呼叫的。(ArgList
中的引數會在呼叫回呼函數之前進行評估。)
從 OTP 25.0 開始,如果評估 Erlang 建構時發生錯誤,例如在模式匹配期間發生 badmatch
或在 comprehension 中發生 bad_generator
,則評估器會分派到 erlang:raise(error, Reason, Stacktrace)
。此呼叫將根據 non_local_allowed/3
回呼函數進行檢查。您可以禁止它、允許它或重新導向到您選擇的另一個呼叫。
引數 State
是一個元組 {ShellState,ExprState}
。回傳值 NewState
具有相同的形式。這可以用於在回呼函數的呼叫之間傳遞狀態。ShellState
中儲存的資料在整個 Shell 工作階段中都有效。ExprState
中儲存的資料僅在評估目前表達式時有效。
有兩種啟動受限 Shell 工作階段的方法:
- 使用 STDLIB 應用程式變數
restricted_shell
,並將回呼模組的名稱指定為其值。範例(使用在callback_mod.erl
中實作的回呼函數):$ erl -stdlib restricted_shell callback_mod
。 - 從正常的 Shell 工作階段中,呼叫函數
start_restricted/1
。這會退出目前的評估器並以受限模式啟動新的評估器。
注意事項
- 當受限 Shell 模式啟用或停用時,在節點上啟動的新作業會分別以受限模式或正常模式執行。
- 如果已在特定節點上啟用受限模式,則連線到此節點的遠端 Shell 也會在受限模式下執行。
- 回呼函數不能用於允許或禁止從編譯程式碼呼叫的函數執行(僅限從在 Shell 提示符號輸入的表達式呼叫的函數)。
載入回呼模組時發生的錯誤會根據受限 Shell 的啟動方式以不同方式處理。
- 如果在模擬器啟動期間透過設定 STDLIB 變數啟動受限 Shell,且無法載入回呼模組,則會使用僅允許
q()
和init:stop()
命令的預設受限 Shell 作為備援。 - 如果使用
start_restricted/1
啟動受限 Shell,且無法載入回呼模組,則會將錯誤報告傳送到錯誤記錄器,且呼叫會回傳{error,Reason}
。
提示
預設的 Shell 提示函數會顯示節點的名稱(如果節點可以是分散式系統的一部分)和目前的命令編號。使用者可以透過呼叫 prompt_func/1
或為 STDLIB 應用程式設定應用程式組態參數 shell_prompt_func
來自訂提示函數。同樣地,也可以透過呼叫 multiline_prompt_func/1
或為 STDLIB 應用程式設定應用程式參數 shell_multiline_prompt
來設定多行提示。
自訂的提示函數會以元組 {Mod, Func}
的形式表示。該函數會以 Mod:Func(L)
的形式呼叫,其中 L
是 Shell 建立的鍵值對清單。目前只有一對:{history, N}
,其中 N
是目前的命令編號。該函數會回傳字元清單或原子。此限制是由於 Erlang I/O 協定所致。清單和原子中允許使用程式碼點 255 以外的 Unicode 字元。請注意,在受限模式下,必須允許呼叫 Mod:Func(L)
,否則會呼叫預設的 Shell 提示函數。
摘要
函數
設定評估器程序的例外處理。會回傳先前的例外處理。預設值 (false
) 是在發生例外時終止評估器程序,這會導致 Shell 建立新的評估器程序。當例外處理設定為 true
時,評估器程序會繼續存在,這表示,例如,連接埠和 ETS 表以及連結到評估器程序的程序會在例外後繼續存在。
將多行提示設定為兩個尾隨點。這是預設函數,但也可以明確設定為 -stdlib shell_multiline_prompt {shell, default_multiline_prompt}
。
一個格式化函數,可以使用 format_shell_func/1
設定,使提交到 Shell 的表達式更美觀。
可用於設定 Erlang Shell 輸出的格式。
設定要保留在歷程記錄清單中的先前命令數為 N
。會回傳先前的數字。預設值為 20。
將多行提示設定為反向空格。它可以明確設定為 -stdlib shell_multiline_prompt {shell, inverted_space_prompt}
或呼叫 multiline_prompt_func({shell, inverted_space_prompt}).
將 Shell 多行提示函數設定為 PromptFunc
。會回傳先前的提示函數。
將 Shell 提示函數設定為 PromptFunc
。會回傳先前的提示函數。
等同於 prompt_width/2
,且 Encoding
設定為 io:user/0
使用的編碼。
它會接收提示並計算其寬度,同時考量其 Unicode 字元和 ANSI 逸出。
設定要保留在歷程記錄清單中的先前命令結果數為 N
。會回傳先前的數字。預設值為 20。
如果互動式 Shell 尚未啟動,則啟動它。它可以用於從 escript 或在使用 -noinput 或 -noshell 旗標啟動 erl 時,以程式設計方式啟動 Shell。
退出正常的 Shell 並啟動受限 Shell。Module
指定函數 local_allowed/3
和 non_local_allowed/3
的回呼模組。此函數旨在從 Shell 中呼叫。
退出受限 Shell 並啟動正常的 Shell。此函數旨在從 Shell 中呼叫。
將清單的美化列印設定為 Strings
。會回傳旗標的先前值。
傳回呼叫程序群組領導者所在節點上的目前 Shell 程序。如果該節點沒有 Shell,此函數將傳回未定義。
函數
設定評估器程序的例外處理。會回傳先前的例外處理。預設值 (false
) 是在發生例外時終止評估器程序,這會導致 Shell 建立新的評估器程序。當例外處理設定為 true
時,評估器程序會繼續存在,這表示,例如,連接埠和 ETS 表以及連結到評估器程序的程序會在例外後繼續存在。
-spec default_multiline_prompt(unicode:chardata()) -> unicode:chardata().
將多行提示設定為兩個尾隨點。這是預設函數,但也可以明確設定為 -stdlib shell_multiline_prompt {shell, default_multiline_prompt}
。
一個格式化函數,可以使用 format_shell_func/1
設定,使提交到 Shell 的表達式更美觀。
注意
此格式化函數會篩選掉表達式中的註解。
-spec format_shell_func(ShellFormatFunc) -> ShellFormatFunc2 when ShellFormatFunc :: default | {module(), function()} | string(), ShellFormatFunc2 :: default | {module(), function()} | string().
可用於設定 Erlang Shell 輸出的格式。
這會對已提交的命令及其在歷程記錄中的儲存方式產生影響。或者,如果在編輯表達式時按下格式化快速鍵(預設為 Alt-r)。您可以指定一個 Mod:Func/1
,它會將整個表達式視為字串並傳回格式化的表達式作為字串。如需如何在 Shell 啟動前設定它,請參閱 stdlib 應用程式組態
。
如果改為提供字串,則會將其用作 Shell 命令。您的命令必須在字串中的某處包含 ${file}
,以便 Shell 知道檔案在命令中的位置。
shell:format_shell_func("\"emacs -batch \${file} -l ~/erlang-format/emacs-format-file -f emacs-format-function\"").
shell:format_shell_func({shell, erl_pp_format_func}).
-spec history(N) -> non_neg_integer() when N :: non_neg_integer().
設定要保留在歷程記錄清單中的先前命令數為 N
。會回傳先前的數字。預設值為 20。
-spec inverted_space_prompt(unicode:chardata()) -> unicode:chardata().
將多行提示設定為反向空格。它可以明確設定為 -stdlib shell_multiline_prompt {shell, inverted_space_prompt}
或呼叫 multiline_prompt_func({shell, inverted_space_prompt}).
-spec multiline_prompt_func(PromptFunc) -> PromptFunc2 when PromptFunc :: default | {module(), function()} | string(), PromptFunc2 :: default | {module(), function()} | string().
將 Shell 多行提示函數設定為 PromptFunc
。會回傳先前的提示函數。
-spec prompt_func(PromptFunc) -> PromptFunc2 when PromptFunc :: default | {module(), atom()}, PromptFunc2 :: default | {module(), atom()}.
將 Shell 提示函數設定為 PromptFunc
。會回傳先前的提示函數。
-spec prompt_width(unicode:chardata()) -> non_neg_integer().
等同於 prompt_width/2
,且 Encoding
設定為 io:user/0
使用的編碼。
-spec prompt_width(unicode:chardata(), unicode | latin1) -> non_neg_integer().
它會接收提示並計算其寬度,同時考量其 Unicode 字元和 ANSI 逸出。
適用於建立自訂多行提示字元。
範例
1> shell:prompt_width("olá> ", unicode).
5
%% "olá> " is printed as "ol\341> " on a latin1 systems
2> shell:prompt_width("olá> ", latin1).
8
%% Ansi escapes are ignored
3> shell:prompt_width("\e[32molá\e[0m> ", unicode).
5
%% Double width characters count as 2
4> shell:prompt_width("😀> ", unicode).
4
%% "😀> " is printed as "\x{1F600}> " on latin1 systems
5> shell:prompt_width("😀> ", latin1).
11
-spec results(N) -> non_neg_integer() when N :: non_neg_integer().
設定要保留在歷程記錄清單中的先前命令結果數為 N
。會回傳先前的數字。預設值為 20。
-spec start_interactive() -> ok | {error, already_started}.
如果互動式 Shell 尚未啟動,則啟動它。它可以用於從 escript 或在使用 -noinput 或 -noshell 旗標啟動 erl 時,以程式設計方式啟動 Shell。
-spec start_interactive(noshell | {module(), atom(), [term()]}) -> ok | {error, already_started}; ({remote, string()}) -> ok | {error, already_started | noconnection}; ({node(), {module(), atom(), [term()]}} | {remote, string(), {module(), atom(), [term()]}}) -> ok | {error, already_started | noconnection | badfile | nofile | on_load_failure}.
如果互動式 Shell 尚未啟動,則啟動它。它可以用於從 escript
或在 erl
使用 -noinput
或 -noshell
旗標啟動時,以程式設計方式啟動 Shell。允許使用下列選項:
noshell - 啟動互動式 shell,如同將
-noshell
參數傳遞給erl
。這僅在 erl 以-noinput
參數啟動,且系統要讀取輸入資料時才有用。{node(), mfa()} - 使用在
node()
上的mfa()
作為預設 shell 啟動互動式 shell。{remote,
string()
, mfa()} - 啟動互動式 shell,如同將-remsh
參數傳遞給erl
,但使用替代的 shell 實作。
發生錯誤時,此函式將返回
already_started - 如果互動式 shell 已經啟動。
noconnection - 如果請求了遠端 shell,但無法連線。
badfile | nofile | on_load_failure - 如果請求的遠端 shell 具有自訂的 mfa(),但無法載入該模組。請參閱 程式碼載入函式的錯誤原因,以了解錯誤原因的描述。
-spec start_restricted(Module) -> {error, Reason} when Module :: module(), Reason :: code:load_error_rsn().
退出正常的 Shell 並啟動受限 Shell。Module
指定函數 local_allowed/3
和 non_local_allowed/3
的回呼模組。此函數旨在從 Shell 中呼叫。
如果無法載入回呼模組,則會返回錯誤元組。錯誤元組中的 Reason
是程式碼載入器嘗試載入回呼模組的程式碼時返回的錯誤原因。
-spec stop_restricted() -> no_return().
退出受限 Shell 並啟動正常的 Shell。此函數旨在從 Shell 中呼叫。
將清單的美化列印設定為 Strings
。會回傳旗標的先前值。
此標記也可以由 STDLIB 應用程式變數 shell_strings
設定。預設值為 true
,表示在可能的情況下,會使用字串語法印出整數列表。值為 false
表示不使用字串語法印出列表。
-spec whereis() -> pid() | undefined.
傳回呼叫程序群組領導者所在節點上的目前 Shell 程序。如果該節點沒有 Shell,此函數將傳回未定義。