ExpectでBASHコマンドを生成する方法は?

ExpectでBASHコマンドを生成する方法は?

Expectスクリプトがあり、入力を提供するためにBASHコマンドを生成したいと思います。次の構文を使用する場合:

spawn /bin/bash docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki`

または:

spawn docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

次のエラーが発生します。

bad flag "-it": must be -glob, -regexp, -exact, -notransfer, -nocase, -i, -
indices, -iread, -timestamp, -timeout, -nobrace, or --
    while executing
"expect {
   spawn (/bin/bash) docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn 
ovpn_initpki
   "Enter PEM pass phrase:"   {send "DefPEMVPNPassPhra..."
    (file "addcontainer.exp" line 7)

BASHコマンドが生成されると予想されるかどうかはどうすればわかりますか?

ベストアンサー1

expectTCL(TCLインタプリタ)から環境変数にアクセスするための構文は次のとおりです$env(VARNAME)

spawn docker run -v $env(OVPN_DATA):/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

一部のシェルコードを解釈するシェルを実行するには実行できますsh -c the-code(またはここのシェルコードbash -cに特定の内容がない場合でも)。bashこれがsystem()ほとんどの言語がすることです。

spawn sh -c {
  docker run -v "$OVPN_DATA:/etc/openvpn" --rm -it kylemanna/openvpn ovpn_initpki
}

{...}これはTCLの強力な提案です。また、シェル変数拡張の周りに欠落している引用符を追加しました。それ以外の場合はzsh//rc構文より構文に近いです。fishsh

また、spawnすべてのexpect ...ステートメントの序文を作成します。コマンドはspawn対話するコマンドを開始する場所であり、ステートメントはexpect ...そのコマンドの特定の出力を待つ場所です。

上記のコードではspawnまったく実行されず、引数内の引数は、以前に生成されたコマンド(存在する場合)の出力または標準入力(存在しない場合)から取得されるパターンとして扱われます。spawnexpect

おすすめ記事