インタラクティブに作成されたサブプロセスに応答する

インタラクティブに作成されたサブプロセスに応答する

eb initAmazon Web Servicesには、現在の作業ディレクトリを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オプション、2番目はオプション、3番目は可能な(または)オプションのリストですappenvironmentenv

私が探しているのは、コマンドをラップ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で同様のライブラリを検索または作成することもできますが、おそらくより多くの作業が必要になるでしょう。あなたが好きなものは何でもできます...

おすすめ記事