[Erlang18]教練!又發現Erlang Shell里面的神奇函數一只


 
人嘛,總是想提高效率,創造更多的價值,同時也得到更多的選擇空間。可一個人的精力,時間終歸是有限的,減少自身重復或無意義工作就顯得格外重要!
要么懂得授權,要么把重復的工作交給機器來做:
現實: 美國人喜歡把不重要的開發外包給其它國家,自己做核心;
身邊:上級們不都是把他們認為不值得親自做的事派發給下級,自己留精力去琢磨更重要的事么?
 
但苦逼如我,根本木有授權,所以只好費勁心思想盡辦法讓機器來做。
 
所以我先從工作調試用得最多的就是shell里面下手,有必要重溫下c.erl這個模塊,看文檔真是"磨刀"好方法,挑幾個很cool的函數來試下。
 

 
C.erl是一個Command Interface Module,
里面的函數只用於shell,有時竟然可以調用時省略掉模塊名,比如這樣   c:pid(A,B,C) ----->pid(A,B,C).
 
 
1.
bt(Pid) -> ok | undefined
就是erlang:process_display(Pid, backtrace)的簡寫版本,可以查看Pid進程的堆棧調用關系
 
2. 
c(File) -> {ok, Module} | error
c(File, Options) -> {ok, Module} | error
c/1,2 編譯,然后再把模塊加加載到code server里面. Options 默認為 []. 等價於:
 
compile:file(File, Options ++ [report_errors, report_warnings])
 
3.
cd(Dir) -> ok
改變工作目錄
 > cd("../erlang").
/home/ron/erlang
 
4.
flush() -> ok
把接受到的消息都刷新到shell里面顯示(這個大家很熟啦,Joe大叔教學時一直用).
 
5.
help() -> ok
顯示所有的幫助信息,顯示此模塊里面可用的所有函數信息.
 
6.
i() -> ok
ni() -> ok
i/0 顯示本地系統相關信息,會把所有進程概要給你. ni/0 也是如此, 但是對互連的所有節點信息
 
7.
i(X, Y, Z) -> [{atom(), term()}]
 
Types:
X = Y = Z = integer() >= 0
顯示指定進程的信息,等價於 process_info(pid(X, Y, Z)).
 
8.
l(Module) -> code:load_ret()
消除舊代碼並更新最新的代碼,如果你想在函數級進里使用這個函數功能,最后是用code:purge(Module) , code:load_file(Module).
 
9.
lc(Files) -> ok
 
Types:
Files = [File]
File = file:filename()
使用 compile:file(File, [report_errors, report_warnings])編譯所有的Files.
 
10.
ls() -> ok
 
和linux下的ls命令一樣:列出當前文件夾的所有文件.
 
11.
m() -> ok
顯示所有已加載模塊的信息,包含他們的頭文件信息.
 
12.
m(Module) -> ok
顯示Module的相關信息,你可以通過這個來查看你要加載的模塊是不是更新成功了
 
13.
nc(File) -> {ok, Module} | error
nc(File, Options) -> {ok, Module} | error
 
Types:
File = file:name()
Options = [Option] | Option
Option = compile:option()
Module = module()
compile:file(File, Options ++ [report_errors, report_warnings])  然后加載到所有的節點上!!!
 
14.
nl(Module) -> abcast | error
將指定模塊加載到所有已連接的節點.
 
15.
regs() -> ok
nregs() -> ok
regs/0 顯示當前節點的所有注冊進程信息 nregs/0 也是一樣,不過是所有節點的.
 

上面的大部分函數我都用過,但這次溫習得到的最大收獲就是: nc/1 和nl/1這2個函數,我以前都不知道!太強大了,不掌握簡直是暴殄天物!
最近剛好有個情景可以用得上:
情景:
1. 測試把一個Bug流離給你;
2.你在自己本地修改好;
3.打開Erlang shell 編譯熱加載;
4.在本地自己測試一通;過了還要提交,再在測試用的服務器上再重復3過程;
這還是順利的時候,復雜時:你在本地明明過了,測試到了測試服務器上怎么都不過,肯定2地代碼沒有同步,這時還要找到那個沒同步的文件,這種都是費時不討好的活。
 
說白了就是解決測試服用的代碼和你本地的代碼一致!
 
你可以把3中加載里直接把本服和測試服都加載好這個模塊!!!,這樣就不會再有不一致的溝通問題啦:
在user_default.erl里面封裝一下:
 
nc_my(File) ->
  net_kernel:connect_node('測試服Node'),
  nc(File).
 
用上這個后,感覺爽多了。
 

 
如果你發現什么神奇的函數,也歡迎在這里分享哇!

 
既使腳再短,也要義無反顧陪你一起翻山越嶺~~~~~~~~
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM