GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo obtener el código de salida del proceso generado en el script de shell esperado?

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?


Linux
  1. ¿Cómo cifrar o hacer que el script de Shell sea ilegible?

  2. ¿Cómo obtener descripciones de las opciones `shopt` disponibles?

  3. ¿Cómo obtener el nombre de la rama git actual en una variable en un script de Shell?

  4. ¿Cómo obtener el contenido de una página web en una variable de shell?

  5. ¿Cómo leo el código fuente de los comandos de shell?

¿Cómo obtener el PYTHONPATH en shell?

¿Cómo obtener la identificación del proceso para eliminar un proceso nohup?

Cómo obtener PID del proceso secundario bifurcado en el script de shell

¿Cómo puedo obtener mi dirección IP externa en un script de shell?

¿Cómo obtener el pid de un proceso e invocar kill -9 en el script de shell?

¿Puede el proceso de inicio ser un script de shell en Linux?