2012-12-30 9 views
6

मैं एक ऐसी स्क्रिप्ट बनाना चाहता था जो मेरे सभी गिटहब भंडारों को अपडेट करेगी।मेरा गिट ऑटो-अपडेट क्यों स्क्रिप्ट काम की अपेक्षा नहीं करता है?

मुझे बस अपना उपयोगकर्ता नाम और मेरा पासवर्ड दर्ज करना होगा, और स्क्रिप्ट रिपॉजिटरीज़ की एक सूची के माध्यम से जाएगी, git push पर कॉल करें और पूरक अपेक्षा स्क्रिप्ट के माध्यम से आवश्यक जानकारी प्रदान करें।

#! /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 एक वैश्विक वातावरण चर कि मेरी स्क्रिप्ट फ़ोल्डर में एक निरपेक्ष पथ है:

यह मेरी पार्टी स्क्रिप्ट है।

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

जब मैं bash स्क्रिप्ट चलाने, चीज़ें अपेक्षित ढंग से जाना:

यहाँ githubexpect स्क्रिप्ट है।

  1. मुझे जानकारी के लिए संकेत दिया गया है।
  2. स्क्रिप्ट सफलतापूर्वक शुरू होती है और project_list.txt फ़ाइल पढ़ने जारी रखती है।
  3. एक बार जब यह खुद को रिपोजिटरी की निर्देशिका में पाता है, तो यह githubexpect स्क्रिप्ट और सही ढंग से जानकारी पर गुजरता है (मैंने इसका परीक्षण किया है)।
  4. githubexpect सही ढंग से git push spawns।
  5. यह इनपुट के लिए संकेत दिया जाता है (मैंने इसे कंसोल में देखा)।
  6. यह मेरी जानकारी प्रदान करता है (फिर से, मैंने यह भी देखा)।
  7. फिर यह कुछ भी हुआ जैसे अगली रिपोजिटरी पर जारी है। < - त्रुटि!

मैं शक कर रहा हूँ कि githubexpect स्क्रिप्ट खुद को उत्पन्न करने वाला हो सकता है git push रिश्तेदार, और न निर्देशिका वर्तमान स्क्रिप्ट में क्रियान्वित किया जा रहा है, इसलिए Git भी भंडार नहीं मिल रहा है। यह शायद गलत है हालांकि मेरे स्क्रिप्ट फ़ोल्डर के रूप में, जिसमें githubexpect रहता है, एक भंडार भी है।

उत्तर

10

आपको \n के बजाय \r भेजना चाहिए। हालांकि वास्तविक समस्या यह है कि आप git push को पूरा करने के लिए प्रतीक्षा न करें। इसे उम्मीद स्क्रिप्ट की अंतिम पंक्ति के रूप में जोड़ें

expect eof 
+0

यह अब काम करता है! क्या आप यह समझाने में मस्तिष्क करेंगे कि कार्यक्रम पूरा होने पर 'eof' क्यों वापस आते हैं? धन्यवाद। – corazza

+0

यह एक उत्कृष्ट SO प्रश्न की तरह लगता है :) – jarodeells

+0

यह आवश्यक नहीं है कि कार्यक्रम ईओएफ लौटाए: स्पॉन्डेड प्रोग्राम निकलता है, और उस स्थिति के लिए कीवर्ड "eof" का उपयोग करने की अपेक्षा होती है। –

संबंधित मुद्दे