web-dev-qa-db-fra.com

Comment obtenir le code de sortie du processus généré dans le script Shell attendu?

J'essaie d'exécuter un script qui exécute un script EXPECT et un processus généré comportant un code de sortie. Mais je ne parviens pas à obtenir le code de sortie du processus généré dans le script principal. J'obtiens toujours zéro comme succès.

attendre que le script soit:

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

Script engendré:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Exécution du script Expect:

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

Le problème est que je ne parviens pas à obtenir le script attendu pour le code de retour généré. Je veux le code de sortie 3 du script spawned au script principal et le script principal doit être exit avec le code de sortie 3.

Aidez-moi s'il vous plaît à obtenir le code de sortie engendré au script principal.

14
ANR

Avec l’aide de glenn, j’ai la solution ..

attendez le script est

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

Script engendré:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Exécution du script Expect:

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

Merci encore une fois Glenn ..

9
ANR

Vous obtenez le statut de sortie du processus généré avec la commande 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

Depuis la page de manuel expect

wait [args]

attend jusqu'à ce qu'un processus généré (ou le processus en cours si aucun n'est nommé) se termine.

wait renvoie normalement une liste de quatre entiers. Le premier entier est le pid du processus attendu. Le deuxième entier est l'identifiant de spawn correspondant. Le troisième entier est -1 si une erreur du système d'exploitation s'est produite ou 0 sinon. Si le troisième entier était 0, le quatrième entier est l'état renvoyé par le processus engendré. Si le troisième entier était -1, le quatrième entier est la valeur de errno définie par le système d'exploitation. La variable globale errorCode est également définie.


Changement

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

à

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

Ajoutez ensuite les commandes lassign et if.

26
glenn jackman

Assurez-vous d'échapper le $ dans l'entrée prévue afin qu'il soit interprété par le shell.

0
Alex