人嘛,总是想提高效率,创造更多的价值,同时也得到更多的选择空间。可一个人的精力,时间终归是有限的,减少自身重复或无意义工作就显得格外重要!
要么懂得授权,要么把重复的工作交给机器来做:
现实: 美国人喜欢把不重要的开发外包给其它国家,自己做核心;
身边:上级们不都是把他们认为不值得亲自做的事派发给下级,自己留精力去琢磨更重要的事么?
 
但苦逼如我,根本木有授权,所以只好费劲心思想尽办法让机器来做。
 
所以我先从工作调试用得最多的就是shell里面下手,有必要重温下c.erl这个模块,看文档真是"磨刀"好方法,挑几个很cool的函数来试下。
 

 
C.erl是一个Command Interface Module,
里面的函数只用于shell,有时竟然可以调用时省略掉模块名,比如这样   c:pid(A,B,C) ----->pid(A,B,C).
 
 
1.

  1. bt(Pid) -> ok | undefined
就是erlang:process_display(Pid, backtrace)的简写版本,可以查看Pid进程的堆栈调用关系
 
2. 
  1. c(File) -> {ok, Module} | error
  2. c(File, Options) -> {ok, Module} | error
c/1,2 编译,然后再把模块加加载到code server里面. Options 默认为 []. 等价于:
 
compile:file(File, Options ++ [report_errors, report_warnings])
 
3.
  1. cd(Dir) -> ok
改变工作目录
  1. > cd("../erlang").
  2. /home/ron/erlang
4.
  1. flush() -> ok
把接受到的消息都刷新到shell里面显示(这个大家很熟啦,Joe大叔教学时一直用).
 
5.

  1. help() -> ok
显示所有的帮助信息,显示此模块里面可用的所有函数信息.
 
6.

  1. i() -> ok
  2. ni() -> ok
i/0 显示本地系统相关信息,会把所有进程概要给你. ni/0 也是如此, 但是对互连的所有节点信息
 
7.

  1. i(X, Y, Z) -> [{atom(), term()}]
  2.  
  3. Types:
  4. X = Y = Z = integer() >= 0
显示指定进程的信息,等价于 process_info(pid(X, Y, Z)).
 
8.

  1. l(Module) -> code:load_ret()
消除旧代码并更新最新的代码,如果你想在函数级进里使用这个函数功能,最后是用code:purge(Module) , code:load_file(Module).
 
9.

  1. lc(Files) -> ok
  2.  
  3. Types:
  4. Files = [File]
  5. File = file:filename()
使用 compile:file(File, [report_errors, report_warnings])编译所有的Files.
 
10.

  1. ls() -> ok
和linux下的ls命令一样:列出当前文件夹的所有文件.
 
11.

  1. m() -> ok
显示所有已加载模块的信息,包含他们的头文件信息.
 
12.

  1. m(Module) -> ok
显示Module的相关信息,你可以通过这个来查看你要加载的模块是不是更新成功了
 
13.

  1. nc(File) -> {ok, Module} | error
  2. nc(File, Options) -> {ok, Module} | error
  3.  
  4. Types:
  5. File = file:name()
  6. Options = [Option] | Option
  7. Option = compile:option()
  8. Module = module()
compile:file(File, Options ++ [report_errors, report_warnings]) 然后加载到所有的节点上!!!
 
14.

  1. nl(Module) -> abcast | error
将指定模块加载到所有已连接的节点.
 
15.

  1. regs() -> ok
  2. nregs() -> ok
regs/0 显示当前节点的所有注册进程信息 nregs/0 也是一样,不过是所有节点的.
 

上面的大部分函数我都用过,但这次温习得到的最大收获就是:nc/1 和nl/1这2个函数,我以前都不知道!太强大了,不掌握简直是暴殄天物!
最近刚好有个情景可以用得上:
情景:
1. 测试把一个Bug流离给你;
2.你在自己本地修改好;
3.打开Erlang shell 编译热加载;
4.在本地自己测试一通;过了还要提交,再在测试用的服务器上再重复3过程;
这还是顺利的时候,复杂时:你在本地明明过了,测试到了测试服务器上怎么都不过,肯定2地代码没有同步,这时还要找到那个没同步的文件,这种都是费时不讨好的活。
 
说白了就是解决测试服用的代码和你本地的代码一致!
 
你可以把3中加载里直接把本服和测试服都加载好这个模块!!!,这样就不会再有不一致的沟通问题啦:
在user_default.erl里面封装一下:
 
  1. nc_my(File) ->
  2. net_kernel:connect_node('测试服Node'),
  3. nc(File).
用上这个后,感觉爽多了。
 

 
如果你发现什么神奇的函数,也欢迎在这里分享哇!

 
既使脚再短,也要义无反顾陪你一起翻山越岭~~~~~~~~
 

[Erlang18]教练!又发现Erlang Shell里面的神奇函数一只的更多相关文章

  1. erlang shell表格数据对齐

    近期在erlang shell做一些測试,为了让測试结果数据显得更直观,想对齐须要打印的数据,做成像表格一样的效果. 開始的想法是在数据中插入tab. 当然,erlang也有对tab的支持,但实际效果 ...

  2. [Erlang30]Erlang shell是如何工作的?

    一些关于Erlang启动进程的分析:希望你会喜欢. 原英文地址:http://ferd.ca/repl-a-bit-more-and-less-than-that.html 研究Erlang shel ...

  3. [Erlang06]在Erlang shell怎么在目录A下编译目录B下的文件,并把生成文件统一放置目录C?

    问题描述: 我们想快速测试一个小功能,第一个反应就是打开Erl shell 直接输入,但是当想测试一个复杂的函数时,一般会写成一个*.erl文件,然后在shell下: cd(FileDir). c(F ...

  4. Shell(四)函数

    函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. 一.格式 shell中函数的定义格式如下: [ function ] funname [()] { action; ...

  5. shell编程基础(四): shell脚本语法之函数及调试

    一.Shell脚本中的函数 和C语言类似,Shell中也有函数的概念,但是函数定义中没有返回值也没有参数列表.例如: #! /bin/sh fun(){ echo "Function fun ...

  6. centos shell编程5 LANMP一键安装脚本 lamp sed lnmp 变量和字符串比较不能用-eq cat > /usr/local/apache2/htdocs/index.php <<EOF重定向 shell的变量和函数命名不能有横杠 平台可以用arch命令,获取是i686还是x86_64 curl 下载 第三十九节课

    centos shell编程5  LANMP一键安装脚本 lamp  sed  lnmp  变量和字符串比较不能用-eq  cat > /usr/local/apache2/htdocs/ind ...

  7. 8、在Shell脚本中使用函数

    学习目标Shell的函数 Shell程序也支持函数.函数能完成一特定的功能,可以重复调用这个函数.函数格式如下: 函数名() {     函数体 }   函数调用方式: 函数名 参数列表   实例:编 ...

  8. Shell脚本之:函数

    Shell 也支持函数.Shell函数必须先定义后使用. 函数的定义与调用 Shell 函数的定义格式如下: function_name () { list of commands [ return ...

  9. 采坑复盘:logging日志能用封装后的函数来打日志,发现filename一直显示封装logging函数的方法所在的文件名

    问题: logging日志能用封装后的函数来打日志,发现filename一直显示封装logging函数的方法所在的文件名 原因: logging记录的是第一个函数执行所在的文件,那用封装的函数,首先执 ...

随机推荐

  1. OpenVPN添加本地路由方法

    我只使用了第一种方法,第二种第三种没有测试. 1. 在OpenVPN配置文件中增加 OpenVPN在连接成功之后会自动增加一些路由,把默认网关改成VPN的,使所有流量都从VPN走.OpenVPN提供了 ...

  2. 2018 Multi-University Training Contest 2-1007(hdu 6315)-题解

    一.题意 给定一个元素个数为$N(1 \le N \le 10^5)$初始序列$a$和$b$,$a$序列的初始值全为$0$,$b$序列的初始值为$1$到$N$的一个排列.有$T(1 \le T \le ...

  3. CFGym 101490J 题解

    一.题目链接 http://codeforces.com/gym/101490 二.题面 三.题意 给你n个点,代表学生所在位置,n个点,代表老师所在位置.每个学生分配一个老师.让你找出一个最小的学生 ...

  4. js 取元素相对页面的高度和宽度

    function pos(elem) {    var x = elem.offsetLeft,  y = elem.offsetTop;    while (elem = elem.offsetPa ...

  5. 「小程序JAVA实战」小程序页面的上拉下拉刷新(50)

    转自:https://idig8.com/2018/09/21/xiaochengxujavashizhanxiaochengxuyemiandeshanglaxialashuaxin49/ 之前已经 ...

  6. ansible模块学习

    ansible的功能: 模块化任务,调用特定的模块,完成特定的任务 基于python语言实现,由paramiko.pyyaml和jinja2三个模块构建 部署简单,agentless,ansible基 ...

  7. inotify监测实例

    /************************************************************************* > File Name: inotify.c ...

  8. LeetCode之链表

    2. Add Two Numbers You are given two linked lists representing two non-negative numbers. The digits ...

  9. Linux学习---linux系统下安装配置Jenkins

    1.首先准备java环境,安装JDK 2.下载jenkins至Linux服务器 下载地址:https://wiki.jenkins-ci.org/display/JENKINS/Installing+ ...

  10. 64 位 win7 使用PLSQL Developer(转)

    由于 PLSQL Developer 没有64位版本,所以在64位系统上运行该程链接64位Oracle时就会报错,笔者为这个问题纠结了好几天,后来通过请教Google + 动手实践,终于搞定了这个问题 ...