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
expect
TCL(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
また、spawn
すべてのexpect ...
ステートメントの序文を作成します。コマンドはspawn
対話するコマンドを開始する場所であり、ステートメントはexpect ...
そのコマンドの特定の出力を待つ場所です。
上記のコードではspawn
まったく実行されず、引数内の引数は、以前に生成されたコマンド(存在する場合)の出力または標準入力(存在しない場合)から取得されるパターンとして扱われます。spawn
expect
答え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"