Linux 控制台交互执行如何实现

快捷键调用bash命令,有没有代替select选择的方法

地址:https://segmentfault.com/q/1010000020662840/a-1020000020689377

标签:Linux

详情描述

给截图到ocr翻译这个流程写了个的bash脚本,为了方便使用给它绑了个快捷键,但是里面涉及select选择ocr语言的交互内容,这样就会失效

有什么其他方法可以简单实现这个过程?

我的回答

有些命令会提供交互模式和非交互模式两种命令执行方式。你可以看看这个命令有没有非交互模式。

如果一定要交互模式的话,可以尝试下编写 expect 脚本模拟操作。一般情况下,expect 在系统已经被默认装了。

它的操作基本就几个指令。

spawn 用于生成子进程
expect 用于期待字符串
send 模拟人工输入字符串

你可以简单的把它命令使用,也可以把它当成脚本解释器,用来编写脚本语言。

举个例子。

假设我现在有个按菜单选择的脚本,menu,内容如下:

#!/bin/bash

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice $REPLY which is $opt"
            ;;
        "Quit")
            break
            ;;
        *) echo "invalid option $REPLY";;
    esac
done

执行的效果如下所示:

clipboard.png

通过实现 expect 怎么模拟这个操作,要编写 expect 的脚本。

#!/usr/bin/expect

spawn ./menu # 启动 menu 子进程

expect "enter your choice: "  # 期待接收到 enter your choice: 
send "1\r" # 输入 1 和 enter 

expect "enter your choice: "  # 期待接收到 enter your choice: 
send "2\r" # 输入 2 和 enter 

expect "enter your choice: "  # 期待接收到 enter your choice: 
send "3\r" # 输入 3 和 enter 

expect "enter your choice: "  # 期待接收到 enter your choice: 
send "4\r" # 输入 4 和 enter 

interact

脚本的开头指定了解释器为 /usr/bin/expect。然后,可以测试一下,和手动执行的效果一样的。

但总觉的每次写这个脚本太废事了。于是自动录制的工具产生了,叫做 autoexpect,在 centos 上安装通过 yum install expect-devel 即可完成。

它的使用非常简单,只要执行 autoexpect 就能启动,然后开始执行你要录制的操作。执行完成后,使用 ctrl+D 结束录制,在当前路径会自动生成一个 script.exp。

录制的脚本内容会比自己写的复杂点,但基本的内容差不多。有时候会需要稍微修改。一般清苦下,录制脚本能按预期执行。但对于一些复杂步骤会有些问题,不一定和预期一样,需要稍微修改,比如时间延时之类的,和周围环境有关。