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

答え2

出力は、spawnコマンド名が見つかったときにフラグの解釈が停止しないことを示しています。

一般的な規則は、--コマンドオプション(構文解析と解釈が必要)と呼び出されるべき引数(無視して渡す必要がある)との区切り文字として機能することです。

出力には、可能なオプションの1つがspawnリストされ、--この規則に従うことを示します。指定してみてください。

spawn /bin/bash -- -c "docker run ..."

答え3

努力する:

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

関連情報