这是 IEx系列
五部分中的第三部分, 在这一部分中, 我们将说明如何创建本地和远程 IEx Shell
.
用户切换菜单( CTRL + G
)可以让我们对 IEx Shell
进行创建和管理.
CTRL + G
进入用户切换菜单: 输入:
?
, 显示可用的用户切换命令,
iex(4)> User switch command --> ? 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 -->
c
, 连接到作业 在连接到作业之前, 我们创建一个本地变量 foo
iex(2)> foo = "this is foo" "this is foo"
键入 CTRL + G
进入用户切换带单
s
, 启动本地Shell
j
, 显示后台作业
--> s --> j 1 {erlang,apply,[#Fun<Elixir.IEx.CLI.1.116904714>,[]]} 2* {shell,start,[]}
*
标识当前作业, 键入 c
, 连接到该作业
--> s --> j 1 {erlang,apply,[#Fun<Elixir.IEx.CLI.1.116904714>,[]]} 2* {shell,start,[]} --> c Eshell V7.3 (abort with ^G) 1>
上面是连接到本地的 Erlang shell
, 下面我们连接到IEx Shell
iex(1)> foo = "this is foo" "this is foo" iex(2)> User switch command --> s 'Elixir.IEx' --> c Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) iex(1)>
现在我们已经在一个 IEx Shell
当中了. 在这个新创建的Shell中输入 foo
,结果如下
iex(1)> foo ** (CompileError) iex:1: undefined function foo/0
我们没有找到之前定义的 foo
, 因为这个新创建的 SHELL
是完全独立的, 现在我们切换回之前的 SHELL
iex(1)> User switch command --> j 1 {erlang,apply,[#Fun<Elixir.IEx.CLI.1.116904714>,[]]} 2* {'Elixir.IEx',start,[]} --> c 1 # 注意这一行需要一个回车, 即一个空行 nil
我们再来看 foo
变量
iex(3)> foo "this is foo" iex(4)>
r
, 启动远程Shell 首先用 --sname
启动两个shell
# 本地Shell ➜ iex --sname local Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) iex(local@localhost)1> # 远程Shell ➜ iex --sname remote Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) iex(remote@localhost)1>
检查节点是否 alive
iex(remote@localhost)1> Node.alive? true iex(remote@localhost)2>
从 local@localhost
连接到 remote@localhost
User switch command --> r 'remote@localhost' 'Elixir.IEx' --> c Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) iex(remote@localhost)1>
我们看到IEx提示符已经变成 iex(remote@localhost)1>
了
在节点 remote@localhost
创建一个模块
iex(remote@localhost)2> defmodule Hello do ...(remote@localhost)2> def foo, do: "this is foo" ...(remote@localhost)2> end {:module, Hello, <<70, 79, 82, 49, 0, 0, 4, 220, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 126, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>, {:foo, 0}}
然后在 local@localhost
连接到的远程Shell中执行 Hello.foo
iex(remote@localhost)1> Hello.foo "this is foo"
成功!
练习:
使用 --name local@127.0.0.1
, --name remote@127.0.0.1
进行测试
最后, 介绍最后一个方法连接到远程Shell, 该方法直接使用命令行的方式连接
➜ iex --sname local --remsh remote@localhost Erlang/OTP 18 [erts-7.3] [source] [64-bit] [smp:8:8] [async-threads:10] [hipe] [kernel-poll:false] Interactive Elixir (1.2.1) - press Ctrl+C to exit (type h() ENTER for help) iex(remote@localhost)1>
这里都是在本机进行测试的, 如果两个节点位于不同的主机上, 请确保两个主机的 $HOME/.erlang.cookie
文件有相同的Cookie值, 或者可以在启动时通过命令行选项 --cookie
指定
iex --cookie 1234567890 --sname remote iex(remote@localhost)1> :erlang.get_cookie :"1234567890" iex --sname local --remsh remote@localhost --cookie 1234567890 iex(remote@localhost)1> :erlang.get_cookie :"1234567890"