2014-05-12 12 views
10

Sto provando ad eseguire uno script che esegue uno script EXPECT e un processo generato che contiene il codice di uscita. Ma non riesco a ottenere il codice di uscita del processo generato nello script principale. Sto sempre diventando zero come successo.Come ottenere il codice di uscita del processo generato nello script di shell previsto?

aspettarsi script è:

[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" 

sceneggiatura Spawned:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Esecuzione di Expect script:

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

Il problema è che non sono in grado di ottenere il codice di uscita di ritorno generato da aspettati script Voglio il codice di uscita 3 dello script generato per lo script principale e lo script principale deve essere chiuso con il codice di uscita 3.

Please help me per ottenere il codice di uscita generato per lo script principale.

+0

Provare a inserire una parte in un file separato, vale a dire lo script di attesa eseguibile e provare a ottenere lo stato di uscita. – PradyJord

+0

@Jord, devo scrivere il metodo expect solo nello script della shell. Non dovrebbe essere un eseguibile separato. – ANR

+0

Ho ricevuto una risposta da: [collegamento] (https://stackoverflow.com/questions/3299502/how-to-return-spawned-process-exit-code-in-expect-script) ma non riesco ad avviare la soluzione in il mio codice Sono una nuova ape per aspettarmi un metodo. – ANR

risposta

8

Con l'aiuto di Glenn, ho trovato la soluzione ..e il mio script finale è ::

aspettarsi script è

[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" 

sceneggiatura Spawned:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Esecuzione di Expect script:

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

Grazie Glenn ancora una volta ..

+5

E puoi esprimere il tuo apprezzamento: http://stackoverflow.com/help/someone-answers –

17

Si ottiene lo stato di uscita del processo generato con il comando wait:

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 

Dal expect man page

aspettare [args]

ritardi finché un processo generato (o il processo corrente se nessuno è denominato) termina.

attendere normalmente restituisce un elenco di quattro numeri interi. Il primo numero intero è il pid del processo che è stato atteso. Il secondo intero è l'id spawn corrispondente. Il terzo numero intero è -1 se si è verificato un errore del sistema operativo o 0 altrimenti. Se il terzo numero intero era 0, il quarto intero è lo stato restituito dal processo generato. Se il terzo numero intero era -1, il quarto intero è il valore di errno impostato dal sistema operativo. Viene anche impostata la variabile globale errorCode.


Change

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

a

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

quindi aggiungere i comandi lassign e if.

+0

Grazie per la rapida risposta @glenn .. Ma confondo ancora come implemento/utilizzo il comando 'wait' nel mio script. Potete aiutarmi pl .. – ANR

+0

Grazie per l'aiuto @glen. Ho provato a eseguire lo script di esempio che hai fornito, ma sto ricevendo il 'nome comando non valido" lassign "'. – ANR

+2

Le tue aspettative devono essere piuttosto vecchie. Usalo invece: 'foreach {pid spawnid os_error_flag value} [wait] break' –

0

Assicurati di evitare l'input $ in the expect in modo che venga interpretato dalla shell.

+0

Questo è un commento ad un'altra risposta. Si prega di dare un'occhiata a [le linee guida sulle risposte] (https://stackoverflow.com/help/how-to-answer). Resta inteso che non hai ancora la reputazione di commentare domande/risposte. La migliore strategia per superare questo problema? Partecipazione su SO. – MrT

Problemi correlati