私はいくつかの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を使おうとしている理由です...
どうもありがとう!