2009-06-30 9 views
0

J'utilise un script bash pour automatiser un ensemble de tests pour un autre code. Le script ressemble à ceci:Rediriger la sortie de test

for i in $(seq 1 10) 
do 
    cd ~/BuildBot 
    rm -rf program  # Remove the directory each time to test installation 
    git clone /localrepo/ 
    cd ~/into/program 
    python2.6 setup.py build_ext -i 
    cd tests 

    python runtest.py >& ~/into/reptest/runtest-all.out.$i 
    echo $? > ~/into/reptest/runtest-all.exit.$i 

done 

Exécuté comme ça, le script fait ce que je veux - me montre un mur de texte, et il enregistre dans un fichier dans le répertoire reptest. Maintenant que j'ai testé l'installation, il devient fastidieux d'attendre que le programme entier soit réinstallé. Cependant, quand je coupe le script jusqu'à

for i in $(seq 1 10) 
do 
    cd ~/into/program/tests 

    python runtest.py >& ~/into/reptest/runtest-all.out.$i 
    echo $? > ~/into/reptest/runtest-all.exit.$i 

done 

Le script se bloque, rien ne se passe, les temps d'attente shell sur une ligne blanche jusqu'à ce que je Ctrl-C il. Qu'arrive-t-il à la sortie? Comment puis-je récupérer mon mur de texte?

+0

Vous n'utilisez pas Windows/Cygwin et vous êtes par erreur passé aux fins de ligne \ r \ n? – Boldewyn

+0

Btw: Je suppose que les fichiers de sortie ne sont pas créés att? – Boldewyn

+0

Vous n'avez pas besoin d'utiliser seq, vous pouvez utiliser: "for i in {1..10}". Changez "python" en "echo" et voyez ce qu'il se passe. Cela éliminerait python ou runtest.py comme coupables. –

Répondre

0
python runtest.py >& ~/into/reptest/runtest-all.out.$i 

Redirige à la fois stdout et stderr de runtest.py dans le fichier ~/dans/reptest/runtest-all.out. $ I. Votre mur de texte provient des déclarations que vous avez élaguées.

Qu'est-ce qui vous intéresse sont probablement quelque chose comme:

(python runtest.py 2>&1) | tee ~/into/reptest/runtest-all.out.$i 

qui court runtest.py python dans un sous-shell et redirigez il est stderr stdout, puis redirigez la sortie de cette sous-shell dans « tee ~/dans/reptest/runtest-all.out. $ i ". tee sauvegarde son fichier stdin dans le fichier donné en argument en plus de le copier sur stdout. Pour savoir pourquoi vos programmes attendent jusqu'à ce que vous l'envoyiez SIGINT, je ne suis pas sûr, je ne vois rien de bash qui devrait bloquer votre script jusqu'à ce qu'il soit interrompu.

Questions connexes