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?