2012-12-30 26 views
6

Tôi muốn tạo một tập lệnh cập nhật tất cả kho lưu trữ GitHub của mình.Tại sao tập lệnh Git auto-update Expect của tôi không hoạt động?

Tôi chỉ cần nhập Tên người dùng và Mật khẩu của mình và tập lệnh sẽ đi qua danh sách các vị trí lưu trữ, gọi git push và cung cấp thông tin cần thiết qua tập lệnh Mong đợi bổ sung.

Đây là kịch bản bash của tôi:

#! /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 là một biến môi trường toàn cầu có chứa một đường dẫn tuyệt đối đến thư mục kịch bản của tôi.

Đây là kịch bản githubexpect:

#! /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 

Khi tôi chạy kịch bản bash, mọi thứ đi như mong đợi.

  1. Tôi được nhắc nhập thông tin.
  2. Tập lệnh bắt đầu thành công và tiếp tục đọc tệp project_list.txt.
  3. Sau khi tìm thấy chính nó trong thư mục của kho lưu trữ, nó gọi tập lệnh githubexpect và một cách chính xác chuyển vào thông tin (Tôi đã thử nghiệm điều này).
  4. githubexpect xuất hiện chính xác git push.
  5. Nó được nhắc nhập liệu (tôi thấy điều này trong bảng điều khiển).
  6. Nó cung cấp thông tin của tôi (một lần nữa, tôi cũng thấy điều này).
  7. Sau đó, nó chỉ tiếp tục đến kho lưu trữ tiếp theo như không có gì xảy ra. < - Lỗi!

Tôi nghi ngờ rằng kịch bản githubexpect có thể đẻ trứng git push so với chính nó, và không phải là thư mục kịch bản hiện nay đang được thực hiện trong, vì vậy git thậm chí không tìm thấy một kho lưu trữ. Điều này có lẽ sai mặc dù là thư mục kịch bản của tôi, trong đó githubexpect cư trú, cũng là một kho lưu trữ.

Trả lời

10

Bạn phải gửi \r thay vì \n. Tuy nhiên vấn đề thực sự là bạn không chờ đợi cho git push để hoàn thành. Thêm dòng này làm dòng cuối cùng của tập lệnh mong đợi

expect eof 
+0

Nó hoạt động ngay bây giờ! Bạn có thể giải thích lý do tại sao các chương trình trả về 'eof' khi chúng được thực hiện? Cảm ơn. – corazza

+0

Điều đó có vẻ giống như một câu hỏi SO tuyệt vời :) – jarodeells

+0

Nó không nhất thiết phải là chương trình trả về eof: thoát khỏi chương trình sinh ra, và Mong đợi xảy ra để sử dụng từ khóa "eof" cho điều kiện đó. –

Các vấn đề liên quan