GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie erhalte ich den Exit-Code des erzeugten Prozesses im erwarteten Shell-Skript?

Mit dem wait erhalten Sie den Exit-Status des gespawnten Prozesses 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

Von der Expect-Manpage

warte [args]

Verzögerungen, bis ein erzeugter Prozess (oder der aktuelle Prozess, falls keiner benannt ist) beendet wird.

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

Ändern

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

zu

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

Fügen Sie dann die lassign hinzu und if Befehle.


Mit Hilfe von Glenn habe ich eine Lösung bekommen.. und mein letztes Skript ist::

erwartetes Skript 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
 }

 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"

Gespawntes Skript:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Ausführung des Expect-Skripts:

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

Danke Glenn noch einmal..


Nachdem ich einige Tage mit dem Erweitern der Variablen im erwarteten Heredoc gekämpft hatte, stieß ich schließlich auf einen anderen Ansatz, von dem ich dachte, dass er für jemanden in Not hilfreich sein könnte. Meine Anforderung war, Befehl und Passwort an eine Shell-Funktion zu übergeben, den Befehl im Remote-Host als Teil von Expect Heredoc auszuführen und den Rückkehr-Exit-Code zu erhalten.

Beispiel:

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

shell_function <cmd> <password>
echo $?

Wie bei allen anderen war das Erweitern von Variablen im Heredoc ein Problem, das den Export des Werts in eine Umgebungsvariable und die Verwendung von env erforderte um die Variable im Heredoc zu erhalten. Da das Passwort eines der Argumente war, wollte ich es nicht als Teil einer Umgebungsvariablen speichern. Anstatt also die Heredoc-Öffnung in einfache Anführungszeichen einzuschließen, wurden die Variablen von Heredoc maskiert. Dies ermöglichte die direkte Verwendung von übergebenen Argumenten.

Es folgt das endgültige Skript:

#! /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: $?"

Im obigen Code ist die Escape-Variable $result . Nachdem Sie die Variable auf \$result geändert haben , das Skript funktionierte wie am Schnürchen.

Mein aufrichtiger Dank gilt den Benutzern, die Antworten auf die folgenden Fragen gegeben haben, die als Sprungbrett für meine Lösung dienten.

Douglas Leeder:Hilfe beim Erwartungsskript, starte cat auf einem entfernten Comp und bekomme die Ausgabe davon in die Variable

glenn jackman:Wie kann ich den erzeugten Prozess-Exit-Code im Expect-Skript zurückgeben?


Linux
  1. Wie erhalte ich die externe IP-Adresse in einem Shell-Skript?

  2. Wie erhalte ich die eigene IP-Adresse und speichere sie in einer Variablen in einem Shell-Skript?

  3. Wie lese ich den Quellcode von Shell-Befehlen?

  4. Wie bekomme ich den PYTHONPATH in der Shell?

  5. Wie bekomme ich die Prozess-ID, um einen Nohup-Prozess zu beenden?

Wie bekomme ich den Namen des aktuellen Git-Zweigs in eine Variable in einem Shell-Skript?

Wie bekomme ich den Inhalt einer Webseite in eine Shell-Variable?

So erhalten Sie den Exit-Status in einer Bash-Schleife

So übergeben Sie ein Argument in Expect über die Befehlszeile in einem Shell-Skript

Wie führe ich Code in der Django-Shell durch ein externes Python-Skript aus?

Wie kann ich meine externe IP-Adresse in einem Shell-Skript abrufen?