web-dev-qa-db-ja.com

どうすればBASHコマンドを期待できますか?

期待スクリプトがあり、入力を提供するために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)

ExpectがBASHコマンドをスポーンするように指示するにはどうすればよいですか?

3
William Edwards

TCLの環境変数にアクセスする構文(expectは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/fish構文がsh構文よりも多くなるためです。

また、_expect ..._ステートメントの前にspawnを付けます。 spawnコマンドは、操作するコマンドを起動するためのもので、_expect ..._ステートメントは、そのコマンドからの特定の出力を待機するためのものです。

上記のコードでは、spawnをまったく実行していません。spawn引数内のexpectは、以前に生成された出力で探すパターンとして使用されますコマンドがある場合はコマンド、そうでない場合はstdinから。

1

試してください:

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

出力は、spawnがコマンド名を検出してもフラグの解釈を停止しないことを示しています。

一般的な慣習は、--コマンドのオプション(構文解析して解釈する必要がある)と、呼び出す必要のあるものへの引数(それを無視して渡す必要がある)の間の区切り文字として。

spawnの出力には--可能なオプションの1つとして、それはその規則に従うことを示唆しています。それを指定してみますか?

spawn /bin/bash -- -c "docker run ..."
0
Wouter Verhelst