期待スクリプトがあり、入力を提供するために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コマンドをスポーンするように指示するにはどうすればよいですか?
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から。
試してください:
spawn /bin/bash
send "docker run -v $OVPN_DATA:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki"
出力は、spawn
がコマンド名を検出してもフラグの解釈を停止しないことを示しています。
一般的な慣習は、--
コマンドのオプション(構文解析して解釈する必要がある)と、呼び出す必要のあるものへの引数(それを無視して渡す必要がある)の間の区切り文字として。
spawn
の出力には--
可能なオプションの1つとして、それはその規則に従うことを示唆しています。それを指定してみますか?
spawn /bin/bash -- -c "docker run ..."