GNU/Linux >> Znalost Linux >  >> Linux

Jak získat výstupní kód vytvořeného procesu ve skriptu očekávaného shellu?

Stav ukončení vytvořeného procesu získáte pomocí wait příkaz:

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

Ze stránky očekávaného manuálu

počkej [args]

zpoždění, dokud se vytvořený proces (nebo aktuální proces, pokud žádný není pojmenován) ukončí.

počkej normálně vrací seznam čtyř celých čísel. První celé číslo je pid procesu, na který se čekalo. Druhé celé číslo je odpovídající spawn id. Třetí celé číslo je -1, pokud došlo k chybě operačního systému, nebo 0 v opačném případě. Pokud bylo třetí celé číslo 0, čtvrté celé číslo je stav vrácený vytvořeným procesem. Pokud bylo třetí celé číslo -1, čtvrté celé číslo je hodnota errno nastavená operačním systémem. Je také nastavena globální proměnná errorCode.

Změnit

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

do

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

Poté přidejte lassign a if příkazy.


S pomocí glenna jsem dostal řešení... a můj konečný skript je::

očekávat skript je

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

Vytvořený skript:

 [Linux Dev:anr ]$ cat tmp_script
 exit 3

Spuštění skriptu Expect:

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

Ještě jednou díky Glenne..


Poté, co jsem se několik dní potýkal s rozšiřující se proměnnou uvnitř očekávaného heredocu, nakonec jsem narazil na jiný přístup, o kterém jsem si myslel, že může být užitečný pro někoho v nouzi. Mým požadavkem bylo předat příkaz a heslo funkci shellu, provést příkaz ve vzdáleném hostiteli v rámci očekávání heredoc a získat návratový výstupní kód.

Příklad:

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

shell_function <cmd> <password>
echo $?

Stejně jako všichni ostatní bylo rozšíření proměnné uvnitř heredoc problémem, který vyžadoval export hodnoty do proměnné prostředí a použití env získat proměnnou uvnitř heredoc. Protože heslo bylo jedním z argumentů, nechtěl jsem jej ukládat jako součást proměnné prostředí. Takže namísto uzavření otevření heredoc do jednoduchých uvozovek byly proměnné heredoc vynechány. To umožnilo přímé použití předávaných argumentů.

Následuje konečný 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: $?"

Ve výše uvedeném kódu je uvozená proměnná očekávání $result . Po změně proměnné na \$result , scénář začal fungovat jako kouzlo.

Upřímně děkuji uživatelům, kteří poskytli odpovědi na následující otázky, které posloužily jako odrazový můstek k dosažení mého řešení.

Douglas Leeder:pomozte s očekávaným skriptem, spusťte cat na vzdáleném kompu a získejte jeho výstup do proměnné

glenn jackman:Jak vrátit vytvořený ukončovací kód procesu ve skriptu Expect?


Linux
  1. Jak získat externí IP adresu ve skriptu Shell?

  2. Jak získat vlastní IP adresu a uložit ji do proměnné ve skriptu Shell?

  3. Jak získat název aktuální větve git do proměnné v shell skriptu?

  1. Jak získat obsah webové stránky v proměnné shellu?

  2. Jak načtu zdrojový kód příkazů shellu?

  3. Jak získat PYTHONPATH v shellu?

  1. Jak předat argument v Expect přes příkazový řádek v shell skriptu

  2. Jak získat ID procesu pro ukončení procesu nohup?

  3. Jak získat PID z rozvětveného podřízeného procesu ve skriptu shellu