Elixir交互式Shell: 3. 创建本地和远程Shell

容器客
• 阅读 3620

Elixir交互式Shell: 1. 运行时系统标记
Elixir交互式Shell: 2. 常用命令
Elixir交互式Shell: 3. 创建本地和远程Shell
Elixir交互式Shell: 4. 处理文件和脚本
Elixir交互式Shell: 5. 配置IEx

这是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"
点赞
收藏
评论区
推荐文章
芝士年糕 芝士年糕
2年前
Linux shell 内建命令
前言一、shell简介shell是Linux系统中一个提供命名行的交互式工具,本质是一个c语言可执行程序,为用户提供了启动程序,管理文件系统中的文件以及运行在Linux系统上的进程的途径。命令行提示符是shell负责交互的部分,允许用户输入文本命令,然后解释命令,并在内核中执行。Linux系统上有多种shell可用,Linux发行版默认的shell都是ba
Stella981 Stella981
3年前
Kotlin 使用命令行执行 kts 脚本
运行REPL(交互式解释器)我们可以运行如下命令得到一个可交互的shell,然后输入任何有效的Kotlin代码,并立即看到结果!123335654fe451bc2e4287e.png(https://oscimg.oschina.net/oscnet/up5a637703f0af06d956ea7ab9
Stella981 Stella981
3年前
Linux Shell DAY6
shell脚本介绍shell脚本结构和执行date命令用法shell脚本中的变量脚本中的逻辑判断shell脚本介绍shell是什么shell是一种脚本语言可以使用逻辑判断、循环等语法可以自定义函数
Stella981 Stella981
3年前
Linux只读账号配置【转】
整个配置的命令如下(主要使用了:Linux bash受限的shell(RESTRICTED SHELL))步骤1.创建只读shell(这步可以省略)lns/bin/bash/bin/rbash2.创建用户并指定用户启动执行的shelluseradds/bin/bashreadonly这步不要指
可莉 可莉
3年前
0615 shell编程1
0615shell编程1一、shell脚本介绍shell是一种脚本语言和传统的开发语言比较,会比较简单shell有自己的语法;可以使用逻辑判断、循环等语法可以自定义函数,目的就是为了减少重复的代码shell是系统命令的集合
Stella981 Stella981
3年前
Linux基础(1)之shell
  shell作为下Linux系统中用户与内核交互的接口,用于将用户输入的命令转化为内核可以理解的指令,进而通过内核操作硬件资源,完成相应的功能。shell分为两种,图形shell和命令行shell。图形shell主要有KDE,Gnome等,命令行shell有常见的sh,zsh,csh,bash,ksh,tcsh等。  这里主介绍最常用的bash
Stella981 Stella981
3年前
0615 shell编程1
0615shell编程1一、shell脚本介绍shell是一种脚本语言和传统的开发语言比较,会比较简单shell有自己的语法;可以使用逻辑判断、循环等语法可以自定义函数,目的就是为了减少重复的代码shell是系统命令的集合
可莉 可莉
3年前
20.1 shell脚本介绍 20.2 shell脚本结构和执行 20.3 date命令用法 20.4 shell脚本中的变量
第二十章shell编程20.1shell介绍shell是一种脚本语言可以使用逻辑判断、循环等语法可自定义函数shell是系统命令的集合shell脚本可以实现自动化运维,能大大增加我们的运维效率20.2shell脚本结构和执行
Stella981 Stella981
3年前
HBase启动失败
如果在hbase的shell中输入了status报错,hbase(main):001:0statusERROR:org.apache.hadoop.hbase.ipc.ServerNotRunningYetException:Serverisnotrunningyetatorg.apache.ha
Wesley13 Wesley13
3年前
Vim配合Shell自动上传ftp
shell代码:!/bin/bash网站配置a1('本地目录;主机;yonghuming;mima;远程目录''本地目录;主机;user;pwd;远程目录')选取的网站配置web""本地根目录webroot"本地apache网站根目录"website1echo$1|awk'{split($0,
Wesley13 Wesley13
3年前
!浅识!shell函数及数组
Shell函数及数组SHELL函数函数的用法基本格式函数的调用示例函数变量的作用范围示例函数的参数递归函数SHELL数组数组定义的方法数组的基本使用方法:1.获取数组长度2.读取某下标赋值