响应交互式生成的子进程

响应交互式生成的子进程

Amazon Web Services 有一个名为 的命令eb init,允许您将当前工作目录启动为 elasticbeanstalk 应用程序。

该命令是交互式的,这意味着eb init将使用选项列表进行响应。

$ eb init

Select a default region
1) us-east-1 : US East (N. Virginia)
2) us-west-1 : US West (N. California)
3) us-west-2 : US West (Oregon)
4) eu-west-1 : EU (Ireland)
5) eu-central-1 : EU (Frankfurt)
6) ap-south-1 : Asia Pacific (Mumbai)
7) ap-southeast-1 : Asia Pacific (Singapore)
8) ap-southeast-2 : Asia Pacific (Sydney)
9) ap-northeast-1 : Asia Pacific (Tokyo)
10) ap-northeast-2 : Asia Pacific (Seoul)
11) sa-east-1 : South America (Sao Paulo)
12) cn-north-1 : China (Beijing)
(default is 3):

上面是region选项,第二个是选项,第三个是可能的(或)选项app列表。environmentenv

我正在寻找的是包装命令eb init并能够传递可以绕过脚本交互性的字符串。

ebInit --region=eu-central-1 --app=my-app --env=my-app-live

我需要解析stdout这里并分割行并获取与传入的参数选项相对应的数字,这非常简单,因为选项可以移动数字。

作为概念验证,我什至可以接受这样的事情。

ebInit --region=5 --app=1 --env=1

我很难相信这些交互式命令是黑匣子,无法以编程方式进行交互。我尝试使用 node.js 执行此操作,但无法让它响应,这是我的旧 stackoverflow 帖子“通过子进程响应交互式命令”,却没有引起人们的注意。

我在 unix / linux 中发布此内容是为了询问这是否可能,如果可能的话,如何以及用什么语言?

答案1

解决expect方案可能会沿着以下思路运行

#!/usr/bin/env expect

# or instead figure out a TCL getopt library
if {[llength $argv] != 3} {
    puts stderr "Usage: $argv0 region app env"
    exit 64
}
set aws_region [lindex $argv 0]
set aws_app    [lindex $argv 1]
set aws_env    [lindex $argv 2]

spawn -noecho eb init

set get_regions 1
while {$get_regions} {
    expect {
        # look for the "1) us-east-1 : US East (N. Virginia)"
        # assign to what TCL calls an array
        -re {([0-9]+). ([a-z0-9-]+) :} {
            set region_to_num($expect_out(2,string)) $expect_out(1,string)
        }
        # how we break out of the loop, also array entry
        # for "default" region if need be
        -re {\(default is ([0-9]+)\)} {
            set region_to_num(default) $expect_out(1,string)
            set get_regions 0
        }
    }
}

# show what we got based on arguments and parse of eb output
puts "region=$aws_region region_num=$region_to_num($aws_region) env=$aws_env"

或者我猜你可以expect在 JavaScript 中找到或编写一个类似的库,但这可能需要更多工作。无论你喜欢什么,都可以...

相关内容