模拟与 CLI 的交互
Simulate the interaction with a CLI
我有一个 CLI 可以启动进程,尤其是交互式 shells 并等待它们,它们可以使用相同的 CLI 关闭。我需要使用 bash 为它创建一些端到端测试,但我看不到如何在终端中模拟执行;输出应发送到 "foreground".
中的进程
假设执行 my-cli start
会启动一个 python 脚本来启动一个子进程(运行 一个交互式 shell)并等待它。
在测试脚本中,exec(my-cli start)
会将当前进程替换为进程 运行 python 脚本而不是交互式 shell,因此我无法与交互式 shell 进行交互]之后。
我考虑过使用管道,但我认为可以使用终端模拟的东西会更好,有什么想法吗?
示例:
假设我的 CLI (cli.py
) 的代码是:
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
正在使用expect
不知道是否可以用交互shell(/bin/bash -i
)
#!/usr/bin/expect -f
spawn python3 cli.py
#expect eof
send -- "echo $$\r"
正如本杰明在评论中提到的那样。我和许多其他人在这种情况下使用了 expect
。只要您知道将在终端中显示的文本,您就可以使用以下网页作为创建 expect 脚本的指南。
- https://www.poftut.com/expect-scripting-tutorial-examples/
- https://www.shellscript.sh/expect.html
- https://www.journaldev.com/1405/expect-script-ssh-example-tutorial
根据提供的示例进行更新。为此,我有一个文件 foo.py:
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
预期文件 (expect-example.exp):
#!/usr/bin/expect
spawn python3 foo.py
expect "*bash*"
send "date\r"
send "exit\r"
interact
当我 运行 这个 expect expect-example.exp
我得到以下信息:
$ expect expect-example.exp
spawn python3 foo.py
bash-3.2$ date
Mon 3 Jun 2019 14:03:37 BST
bash-3.2$ exit
exit
$
值得一提的是,鉴于我正在 运行 执行单个命令 date
并且我想查看它的输出 我必须在末尾包含 interact
命令的脚本。否则,我的期望脚本会在发送日期命令后立即退出,不会等待响应。
我有一个 CLI 可以启动进程,尤其是交互式 shells 并等待它们,它们可以使用相同的 CLI 关闭。我需要使用 bash 为它创建一些端到端测试,但我看不到如何在终端中模拟执行;输出应发送到 "foreground".
中的进程假设执行 my-cli start
会启动一个 python 脚本来启动一个子进程(运行 一个交互式 shell)并等待它。
在测试脚本中,exec(my-cli start)
会将当前进程替换为进程 运行 python 脚本而不是交互式 shell,因此我无法与交互式 shell 进行交互]之后。
我考虑过使用管道,但我认为可以使用终端模拟的东西会更好,有什么想法吗?
示例:
假设我的 CLI (cli.py
) 的代码是:
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
正在使用expect
不知道是否可以用交互shell(/bin/bash -i
)
#!/usr/bin/expect -f
spawn python3 cli.py
#expect eof
send -- "echo $$\r"
正如本杰明在评论中提到的那样。我和许多其他人在这种情况下使用了 expect
。只要您知道将在终端中显示的文本,您就可以使用以下网页作为创建 expect 脚本的指南。
- https://www.poftut.com/expect-scripting-tutorial-examples/
- https://www.shellscript.sh/expect.html
- https://www.journaldev.com/1405/expect-script-ssh-example-tutorial
根据提供的示例进行更新。为此,我有一个文件 foo.py:
import subprocess
process = subprocess.Popen(['/bin/bash', '-i'], shell=False)
process.communicate()
预期文件 (expect-example.exp):
#!/usr/bin/expect
spawn python3 foo.py
expect "*bash*"
send "date\r"
send "exit\r"
interact
当我 运行 这个 expect expect-example.exp
我得到以下信息:
$ expect expect-example.exp
spawn python3 foo.py
bash-3.2$ date
Mon 3 Jun 2019 14:03:37 BST
bash-3.2$ exit
exit
$
值得一提的是,鉴于我正在 运行 执行单个命令 date
并且我想查看它的输出 我必须在末尾包含 interact
命令的脚本。否则,我的期望脚本会在发送日期命令后立即退出,不会等待响应。