У меня есть сценарий Bash, который включает в себя сценарий ожидания/TCL EOF в отдельной функции. Сценарий ожидания выйдет с 0-4 возможными кодами выхода в зависимости от того, что определяет сценарий ожидания/TCL с удаленного устройства, и в операторе if ... elif ... else
я пишу конкретную строку переменной в зависимости от этого кода выхода (в рамках функции ожидания/TCL). Затем управление передается обратно в сценарий Bash, где содержит блок case
, содержащий строку, содержащуюся в указанной переменной.Сценарий Broken expect/TCL
Проблема, с которой я столкнулся, заключается в том, что моя функция Bash, которая содержит сценарий expect/TCL, не улавливает код выхода 3 (ну, как и я, я вижу, что запись в файле журнала правильно записывается в файл журнала, но если я эхо значение кода выхода, которое оно фактически улавливает ноль, когда ситуация должна быть 3), и поэтому мой оператор case
не переключается точно.
Вы можете найти ошибку?
(Я нарезал сценарий прямо до этих частей, чтобы сохранить пост кратким и конкретным, поэтому просто предположим, что окружающий код работает нормально).
function myTclFunc()
{
/usr/bin/expect<<EOF
proc log_msg {msg {to_stdout no}} {
set log_line "[timestamp -format {[%d/%m/%Y @ %T]}] \$msg"
set fh [open ~/mylogfile.log a]
puts \$fh \$log_line
close \$fh
if {\$to_stdout} {puts \$log_line}
}
;#exp_internal 1
set timeout 5
set send_human {.1 .3 1 .05 2}
spawn ssh -o "StrictHostKeyChecking no" "[USER]@$1"
expect {
"password: " { send -h "[MY_PASSWD]\r" }
timeout { log_msg "A RELEVANT STRING TO LOG $1/$2"; exit 1 }
}
set timeout 3
sleep 1 ;
send -h "[COMMAND A]\r" ;
expect {
timeout { exit 1 }
-re {\m\d{1,}(\.\d{1,}){3}\M}
}
if { ! [regexp {192\.[0-9]{1,3}\.{2}[0-9]{1,3}} $expect_out(0,string)]} {
send -h "[COMMAND B]\r" ;
}
expect {
"[STRING 1]" {
send -h "[COMMAND C]\r" ;
log_msg "Problem F on $1/$2" ;
exit 3
}
"[STRING 2]" {
send -h "[COMMAND D]\r" ;
sleep 1 ;
send -h "[COMMAND E]\r" ;
send -h "\r" ;
puts "\r"
;#exit 0
}
}
expect eof
EOF
if [[ $? -eq 0 ]]; then
passBack="GOOD";
elif [[ $? -eq 3 ]]; then
passBack="BAD";
else
passBack="TIMEOUT";
fi;
}
[...snipped code...]
myTclFunc $myVar $1
case "$passBack" in
GOOD)
echo ""
exit 0
;;
BAD)
echo ""
exit 4
;;
CHECK)
echo ""
exit 3
;;
esac;
[...snipped code...]
Полезно, хотя, к сожалению, я все еще вижу проблему, при которой код выхода 3 не попадает. –
@ дядя-junky Hah; там есть классическая проблема. Вы все еще нуждаетесь в других проблемах ... –
А, я вижу. Я удивлен, что моя книга Oreilly «Shell Scripting» не включает это ... Спасибо, я буду проверять. –