3

私はいくつかのbashスクリプトを自動化するためにexpectを使用しています。ソーススクリプトを実行する必要があるまで、すべてがうまくいきます。次に、このエラーが発生します:

couldn't execute "source setNAME.sh": no such file or directory
while executing
"spawn "source setNAME.sh""
(file "./setNAME.exp" line 2)

私は基本的な方法 (スポーン/期待/送信/対話) で期待を使用します。問題はスポーンにあります。非常に簡単な例を示しましょう。

名前を読み取り、値をエコーし​​、「NAME」として環境にエクスポートするスクリプト:

/home/edu/scripts [] cat setNAME.sh
#!/bin/bash
echo "Your name?"
read name
export NAME=$name
echo "Provided NAME is $name"

「source」で実行すると、入力値が環境変数としてエクスポートされます。ちょうど私が必要なもの:

/home/edu/scripts [] source setNAME.sh
Your name?
Dennis
Provided NAME is Dennis

/home/edu/scripts [] echo $NAME
Dennis

名前として「edu」を設定して、相互作用を回避するためにexpectを使用しましょう。

/home/edu/scripts [] cat setNAME.exp
#!/usr/bin/expect
spawn setNAME.sh
expect "Your name?"
send edu\r
interact

/home/edu/scripts [] setNAME.exp
spawn setNAME.sh
Your name?
edu
Provided NAME is edu

/home/edu/scripts [] echo $NAME
Dennis

ただし、名前は明らかに Dennis のままです。「edu」は sh スクリプトの出力に表示されますが、expect スクリプトがソース (またはスクリプトの前にドット) なしで setNAME.sh スクリプトを生成するため、NAME としてエクスポートされません。

問題は、最初にエラーがコメントされているため、これを実行できないことです。

このニーズを解決/余裕のあるアイデアはありますか?

私の場合、スクリプトははるかに複雑で、他のソリューションも無効です。たとえば、次のようになります。

source script.sh << EOF
<option1>
<option2>
...
EOF

それが私がexpectを使おうとしている理由です...

どうもありがとう!

4

1 に答える 1