Obtiene el estado de salida del proceso generado con el 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
Desde la página man espera
espera [argumentos]
se retrasa hasta que finaliza un proceso generado (o el proceso actual si no se nombra ninguno).
esperar normalmente devuelve una lista de cuatro enteros. El primer entero es el pid del proceso que se esperaba. El segundo entero es la identificación de generación correspondiente. El tercer entero es -1 si se produjo un error del sistema operativo o 0 en caso contrario. Si el tercer entero era 0, el cuarto entero es el estado devuelto por el proceso generado. Si el tercer entero era -1, el cuarto entero es el valor de errno establecido por el sistema operativo. También se establece la variable global errorCode.
Cambiar
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
}
a
expect {
"INVALID " { exit 4 }
timeout { exit 4 }
eof
}
Luego agrega el lassign
y if
comandos.
Con la ayuda de Glenn, obtuve la solución... y mi guión final es::
el guión esperado es
[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"
Guión generado:
[Linux Dev:anr ]$ cat tmp_script
exit 3
Ejecución del script Expect:
[Linux Dev:anr ]$ ./testexit.sh
exit 3
spawn /home/anr/tmp_script_temp.sh
exit status: 3
spawned process status 3
done
Gracias Glenn una vez más..
Después de luchar unos días con la variable de expansión dentro del expect heredoc, finalmente encontré otro enfoque que pensé que podría ser útil para alguien que lo necesita. Mi requisito era pasar el comando y la contraseña a una función de shell, ejecutar el comando en el host remoto como parte de esperar heredoc y obtener el código de salida de retorno.
Ejemplo:
function shell_function {
# Get the command and password as arguments
# Run command using expect
# Return the exit code
}
shell_function <cmd> <password>
echo $?
Como todos los demás, la expansión de la variable dentro de heredoc fue un problema, que requería exportar el valor a una variable de entorno y usar env
para obtener la variable dentro de heredoc. Dado que la contraseña era uno de los argumentos, no quería almacenarla como parte de una variable de entorno. Entonces, en lugar de encerrar la apertura de heredoc con comillas simples, las variables de heredoc se han escapado. Esto permitió el uso directo de los argumentos pasados.
El siguiente es el guión final:
#! /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: $?"
En el código anterior, la variable de expectativa escapada es $result
. Después de cambiar la variable a \$result
, el script comenzó a funcionar a la perfección.
Mi más sincero agradecimiento a los usuarios que han proporcionado respuestas a las siguientes preguntas, que sirvieron como trampolín para llegar a mi solución.
Douglas Leeder:ayuda con el script de expectativa, ejecuta cat en una compilación remota y obtén el resultado en la variable
glenn jackman:¿Cómo devolver el código de salida del proceso generado en el script Expect?