2012-12-30 9 views
6

GitHubのすべてのリポジトリを更新するスクリプトを作成したかったのです。私のgit auto-update Expectスクリプトはなぜ機能しないのですか?

ユーザー名とパスワードを入力するだけで、スクリプトはリポジトリのリストを参照し、git pushと呼び出し、補足のExpectスクリプトを介して必要な情報を提供します。

これは私のbashスクリプトです:

#! /bin/bash 

echo "Updating GitHub projects from project_list.txt." 
echo 

read -p "GitHub username: " un 
read -p "GitHub password: " -s pw 

echo 
echo 

while read line 
do 
    eval dir=$line 
    echo "Updating:" $dir"." 
    cd $dir 
    $SF/githubexpect $un $pw 
    echo 
    echo 
done < $SF/project_list.txt 

$SFは私のスクリプトフォルダへの絶対パスが含まれている地球環境変数です。ここで

がgithubexpectスクリプトです:私はbashスクリプトを実行すると

#! /usr/bin/expect 

set un [lindex $argv 0] 
set pw [lindex $argv 1] 

spawn git push 

expect "Username" 
send $un\n 

expect "Password" 
send $pw\n 

、物事は期待通りに行きます。

  1. 情報の入力を求められます。
  2. スクリプトは正常に開始し、project_list.txtファイルの読み取りを続けます。
  3. リポジトリのディレクトリに自分自身が見つかると、githubexpectスクリプトが呼び出され、が正しく返されます。が情報を渡します(これをテストしました)。
  4. githubexpectが正しく生成されるgit push
  5. 入力を求めるプロンプトが表示されます(コンソールでこれを確認しました)。
  6. 私の情報を提供しています(もう一度、これも見ました)。
  7. その後、何も起こらないように次のリポジトリに進みます。 < - エラー!

することは、私はgithubexpectスクリプトは現在のスクリプトがで実行されているディレクトリをそれ自体にgit push相対産卵し、ないかもしれないと疑っていますので、gitのにもリポジトリを見つけることができません。 githubexpectが存在する私のスクリプトフォルダがリポジトリでもあるので、これはおそらく間違いです。

答えて

10

\nの代わりに\rを送信する必要があります。しかし実際の問題はgit pushが完了するのを待つことではありません。これをexpectスクリプトの最後の行に追加してください。

expect eof 
+0

これは今動作します!完了したらなぜプログラムが 'eof'を返すのか説明してもらえますか?ありがとう。 – corazza

+0

それは優秀なSOの質問のようです:) – jarodeells

+0

必ずしもプログラムがeofを返すわけではありません。スポーンされたプログラムが終了し、Expectはその条件にキーワード "eof"を使用します。 –

関連する問題