2016-08-08 12 views
0

Ich versuche, in ein Verzeichnis zu wechseln und zusätzliche Befehle innerhalb meines whiptail Dialogfelds auszuführen, aber nach dem Klonen meines Git-Repositorys scheint mein Skript jetzt zu sterben, wenn ich in das Verzeichnis wechseln möchte:Bash whiptail stirbt beim Ändern des Verzeichnisses

STATUS=0 
touch log.txt 
while [ $STATUS -lt "100" ]; do 
    echo "cloning Repo" >> log.txt 
    git clone [email protected]:abc/repo.git /repo >> log.txt 2>&1 
    echo "changing directory" >> log.txt 
    cd /repo >> log.txt 2>&1 
    echo `pwd` 
    echo "installing bundler" >> log.txt 
    gem install bundler --no-ri --no-rdoc >> log.txt 2>&1 
    ((STATUS += 99)) 
    echo $STATUS 
done | whiptail --gauge "Setting Up Neo (THIS WILL TAKE SOME TIME)..." 40 78 0 
;; 

Logging-Befehle mit set -x, das wie folgt aussieht:

:66+STATUS=0 
:67+touch log.txt 
:149+whiptail --gauge 'Setting Up (THIS WILL TAKE SOME TIME)...' 40 78 0 
:68+'[' 0 -lt 100 ']' 
:71+echo 'apt-get update' 
:73+(( STATUS += 15 )) 
:74+echo 15 
:77+echo 'apt-get upgrade' 
:79+(( STATUS += 15 )) 
:80+echo 30 
:83+echo 'apt-get -y git-all' 
:85+(( STATUS += 15 )) 
:86+echo 45 
:111+(( STATUS += 30 )) 
:112+echo 75 
:115+rm -rf /repo 
:116+echo 'cloning Repo' 
:117+git clone [email protected]:abcd/repo.git /repo 
:118+echo 'changing directory' 
:119+cd /repo 
::120+pwd 
:120+echo /repo 
:121+echo 'installing bundler' 
:122+gem install bundler --no-ri --no-rdoc 
:148+echo 100 
:68+'[' 100 -lt 100 ']' 
:5+true 
::11+whiptail --title 'Configuration Menu' --menu 'Choose an option' 40 78 30 1 'Show current configuration.' 2 'Setup Wizard.' 0 Exit 

die Ausgabe von log.txt Stopps an changing directory und mein whiptail Menü geht zurück auf die Hauptseite (als ob t er Setup fertig ist, aber es ist nicht, da ich auch die pwd und installing bundler im Protokoll zu) sehen sollte:

cloning Repo 
Cloning into '/repo'... 
changing directory 

Ich erhalte keine Fehler, so die Diagnose, was posiert vor sich geht ist das Problem für mich zu sein . Jede Hilfe wird geschätzt!

+0

Welche Version von bash? Angenommen, es ist 4.x, können Sie im Detail zu einem nicht standardmäßigen Dateideskriptor –

+0

auch früher im Skript, haben Sie 'set -e' (oder setzen Sie eine ERR-Falle)? –

+1

... bevor Sie das tun: 'exec {tracefd}> trace.log; BASH_XTRACEFD = $ tracefd; PS4 = ': $ LINENO +'; Setzen Sie "-x" und dann bündeln Sie in "trace.log"; Damit werden die ausgeführten Befehle protokolliert, denen jeweils die Zeilennummer vorangestellt ist. –

Antwort

0

Da Sie für jeden Befehl >>log.txt verwenden, wird diese Protokolldatei für jeden Befehl erneut geöffnet. Dies bedeutet, dass die Verwendung von cd das Verzeichnis ändert, in dem diese Protokolldatei erstellt wird.

Um dies zu beheben, am Anfang des Skripts, zu verwenden:

exec 3>log.txt 

... und, wenn Sie in diese Datei schreiben wollen, hängen Sie >&3 auf jeden Befehl, die zuvor schreiben geöffneter Dateideskriptor.

+0

Das funktioniert gut, aber das einzige Problem, das mir begegnet, ist, dass> & 3 die Ausgabe auf den Bildschirm umleitet, was das "Whiptail" -Messgerät mit Text anstelle der Prozentsätze überläuft. Ursprünglich habe ich '>> log.txt 2> & 1' benutzt, was die Ausgabe auf' log.txt' unterdrückt hat. – Godzilla74

+0

'> & 3' leitet die Ausgabe nicht auf den Bildschirm um. Vielleicht beziehen Sie sich auf * stderr * auf den Bildschirm? Um zu vermeiden, dass Sie entweder '> & 3 2> & 1' oder'> & 3 2> & 3' wollen –

+0

Ok, so mochte ich Ihre Auto-fd-Zuweisungsmethode ... 'exec {log_fd}> log.txt' welche Ich habe am Anfang platziert. Nun habe ich folgendes für einen Befehl 'gem install bundler --no-ri --no-rdoc> & $ log_fd'. Muss ich die 'exec ...' oben auf etwas wie 'exec {log_fd}> & 3 2> & 1> log.txt' einstellen oder ist das falsch? Entschuldigung ... die FD-Methode ist mir fremd! – Godzilla74

Verwandte Themen