2014-05-12 6 views
10

Ich versuche ein Skript auszuführen, das ein EXPECT-Skript und einen erzeugten Prozess ausführt, in dem Exit-Code enthalten ist. Aber ich kann den Beendigungscode des erstellten Prozesses nicht zum Hauptskript abrufen. Ich werde immer Null als Erfolg.Wie bekomme ich den Exit-Code des erzeugten Prozesses im expect-Shell-Skript?

Skript erwarten ist:

[Linux Dev:anr ]$ cat testexit.sh 
#!/bin/bash 
export tmp_script_file="/home/anr/tmp_script_temp.sh" 
cp /home/anr/tmp_script $tmp_script_file 
chmod a+x $tmp_script_file 
cat $tmp_script_file 
expect << 'EOF' 
set timeout -1 
spawn $env(tmp_script_file) 
expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
} 
EOF 
echo "spawned process status" $? 
rm -f $tmp_script_file 
echo "done" 

Spawned Skript:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Ausführung von Expect-Skript:

[Linux Dev:anr ]$ ./testexit.sh 
exit 3 
spawn /home/anr/tmp_script_temp.sh 
spawned process status 0 
done 

Problem ist, ich bin nicht in der Lage den erzeugten Ausgang Return-Code zu erhalten, Skript erwarten. Ich möchte den Exit-Code 3 von launched Skript zu Hauptskript und Hauptskript sollte mit Exit-Code 3 beenden.

Bitte helfen Sie mir, den erzeugten Code zum Haupt-Skript erzeugt.

+0

Versuchen Sie, erwarten Teil in einer separaten Datei, z. B. ausführbare expect-Skript und versuchen Sie und erhalten Sie den Exit-Status dann. – PradyJord

+0

@Jord, ich muss nur im Shell-Skript Methode expect schreiben. Es sollte nicht separat ausführbar sein. – ANR

+0

Ich habe eine Antwort von: [link] (https://stackoverflow.com/questions/3299502/how-to-return-spawned-process-exit-code-in-expect-script), aber nicht in der Lage, diese Lösung einzuleiten mein Code. Ich bin eine neue Biene für die Expect-Methode. – ANR

Antwort

8

Mit Hilfe von Glenn, habe ich eine Lösung ..und meine endgültige Skript ist ::

erwarten Skript

[Linux Dev:anr ]$ cat testexit.sh 
#!/bin/bash 
export tmp_script_file="/home/anr/tmp_script_temp.sh" 
cp /home/anr/tmp_script $tmp_script_file 
chmod a+x $tmp_script_file 
cat $tmp_script_file 
expect << 'EOF' 
set timeout -1 
spawn $env(tmp_script_file) 
expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
eof 
} 

foreach {pid spawnid os_error_flag value} [wait] break 

if {$os_error_flag == 0} { 
    puts "exit status: $value" 
    exit $value 
} else { 
    puts "errno: $value" 
    exit $value 
} 
EOF 
echo "spawned process status" $? 
rm -f $tmp_script_file 
echo "done" 

Spawned Skript:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Ausführung von Expect-Skript:

[Linux Dev:anr ]$ ./testexit.sh 
exit 3 
spawn /home/anr/tmp_script_temp.sh 
exit status: 3 
spawned process status 3 
done 

Dank Glenn noch einmal ..

+5

Und Sie können Ihre Wertschätzung ausdrücken: http://stackoverflow.com/help/someone-answers –

17

Sie erhalten den Exit-Status des erzeugten Prozess mit dem wait Befehl:

expect <<'END' 
log_user 0 
spawn sh -c {echo hello; exit 42} 
expect eof 
puts $expect_out(buffer) 

lassign [wait] pid spawnid os_error_flag value 

if {$os_error_flag == 0} { 
    puts "exit status: $value" 
} else { 
    puts "errno: $value" 
} 
END 
hello 

exit status: 42 

Vom expect man page

warten [args]

Verzögerungen, bis ein erzeugter Prozess (oder der aktuelle Prozess, wenn keiner benannt wurde) endet.

warten gibt normalerweise eine Liste von vier Ganzzahlen zurück. Die erste ganze Zahl ist die PID des Prozesses, auf den gewartet wurde. Die zweite ganze Zahl ist die entsprechende Spawn-ID. Die dritte Ganzzahl ist -1, wenn ein Betriebssystemfehler aufgetreten ist, andernfalls 0. Wenn die dritte Ganzzahl 0 ist, ist die vierte Ganzzahl der Status, der vom erzeugten Prozess zurückgegeben wird. Wenn die dritte Ganzzahl -1 ist, ist die vierte Ganzzahl der Wert von errno, der vom Betriebssystem festgelegt wird. Die globale Variable errorCode wird ebenfalls festgelegt.


ändern

expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
} 

zu

expect { 
    "INVALID " { exit 4 } 
    timeout  { exit 4 } 
    eof 
} 

Dann fügen Sie die lassign und if Befehle.

+0

Danke für die schnelle Antwort @Glenn .. Aber ich verwechsle immer noch, wie ich in meinem Skript 'Warte'-Befehl implementieren/verwenden. Können Sie mir helfen, pl .. – ANR

+0

Danke für die Hilfe @ glen. Ich habe versucht, das von Ihnen angegebene Beispielskript auszuführen, aber ich erhalte den ungültigen Befehlsnamen "lassign" '. – ANR

+2

Ihr erwartet muss ziemlich alt sein. Verwenden Sie stattdessen: 'foreach {pid spawnid os_error_flag Wert} [warten] Pause ' –

0

Achten Sie darauf, das $ in der expect-Eingabe zu vermeiden, damit es von der Shell interpretiert wird.

+0

Dies ist ein Kommentar zu einer anderen Antwort. Bitte werfen Sie einen Blick auf [die Richtlinien zu den Antworten] (https://stackoverflow.com/help/how-to-answer). Es versteht sich, dass Sie noch nicht den Ruf haben, Fragen/Antworten zu kommentieren. Die beste Strategie, um dieses Problem zu überwinden? Teilnahme an SO. – MrT

Verwandte Themen