GNU/Linux >> Linux Esercitazione >  >> Linux

Come ottenere il codice di uscita del processo generato nello script di shell atteso?

Ottieni lo stato di uscita del processo generato con wait comando:

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

Dalla pagina man di wait

aspetta [args]

ritarda fino a quando un processo generato (o il processo corrente se non ne viene nominato nessuno) termina.

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

Cambia

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

a

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

Quindi aggiungi il lassign e if comandi.


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

aspettati che lo script sia

 [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 generato:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Esecuzione dello script Expect:

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

Grazie ancora Glenn..


Dopo aver lottato per alcuni giorni con l'espansione della variabile all'interno di wait heredoc, finalmente mi sono imbattuto in un altro approccio che pensavo potesse essere utile a qualcuno nel bisogno. Il mio requisito era passare il comando e la password a una funzione di shell, eseguire il comando nell'host remoto come parte di wait heredoc e ottenere il codice di uscita restituito.

Esempio:

function shell_function {
   # Get the command and password as arguments
   # Run command using expect
   # Return the exit code
}

shell_function <cmd> <password>
echo $?

Come tutti gli altri, l'espansione della variabile all'interno dell'heredoc era un problema, che richiedeva l'esportazione del valore in una variabile d'ambiente e l'uso di env per ottenere la variabile all'interno di heredoc. Poiché la password era uno degli argomenti, non volevo memorizzarla come parte di una variabile di ambiente. Quindi, invece di racchiudere l'apertura di heredoc tra virgolette singole, le variabili di heredoc sono state sfuggite. Ciò ha consentito l'utilizzo diretto degli argomenti passati.

Di seguito è riportato lo script finale:

#! /bin/bash
# This function runs a command like 'ssh' and provides the password
function run_with_password {
    cmd="$2"
    paswd="$1"
    expect << END
        set timeout 60
        spawn $cmd
        expect {
            "yes/no" { send "yes\r" }
            "*assword*" { send -- $paswd\r }
        }
        expect EOF
        catch wait result
        exit [lindex \$result 3]
END
}

my_password="AnswerIS42Really?"
cmd_to_run="ssh [email protected]"
cmd_to_run="$cmd_to_run ls .sawfish"
run_with_password $my_password "$cmd_to_run"
echo "Command run code: $?"

Nel codice precedente la variabile di attesa con escape è $result . Dopo aver modificato la variabile in \$result , lo script ha iniziato a funzionare a meraviglia.

I miei sinceri ringraziamenti agli utenti che hanno fornito risposte alle seguenti domande, che sono servite da trampolino di lancio per raggiungere la mia soluzione.

Douglas Leeder:aiuto con lo script expect, esegue cat su remote comp e ne ottiene l'output nella variabile

glenn jackman:Come restituire il codice di uscita del processo generato nello script Expect?


Linux
  1. Come ottenere l'indirizzo IP esterno in uno script di shell?

  2. Come crittografare o rendere illeggibile lo script della shell?

  3. Come ottenere le descrizioni delle opzioni `shopt` disponibili?

  4. Non riesci a ottenere il codice di uscita corretto da uno script?

  5. Come ottenere ulteriori informazioni sull'origine di un codice di uscita?

Come ottenere il proprio indirizzo IP e salvarlo in una variabile in uno script di shell?

Come ottenere lo stato di uscita un ciclo in bash

Come ottenere PYTHONPATH nella shell?

Come passare l'argomento in Expect tramite la riga di comando in uno script di shell

Come ottenere l'ID del processo per terminare un processo nohup?

Come ottenere il PID dal processo figlio biforcuto nello script della shell