捕获Expect脚本的退出代码

时间:2016-09-20 08:07:10

标签: error-handling scripting expect

我有一个expect脚本,可以将文件从一个服务器传输到另一个服务器。这个期望脚本正在由shell脚本启动。如果文件在源中可用,则expect脚本可以传输该文件,并且它将提供零退出代码。但是,当文件在源中不可用时,脚本将不会传输文件,但它仍将提供零退出代码。

如何捕获expect脚本的正确退出代码。

test.sh:

VirtualHost

test.exp来:

SELECT t1.TITLE,
       t1.DIRECTOR,
       COALESCE(t2.VIDEOSNUMBER, 0) AS VIDEOSNUMBER
FROM Movie t1
LEFT JOIN
(
    SELECT v.TITLE, COUNT(DISTINCT r.COLLOC) AS VIDEOSNUMBER
    FROM Rent r
    INNER JOIN Video v
        ON r.COLLOC = v.COLLOC
    GROUP BY v.TITLE
) t2
   ON t1.TITLE = t2.TITLE
ORDER BY COALESCE(t2.VIDEOSNUMBER, 0) DESC

示例在源中没有可用文件时输出:

#!/bin/sh

DT=`date +%Y%m%d`
RXHOME=/tmp'

x_server=A1234
x_file="test_${DT}.dat"

cd $RXHOME/scripts

./test.exp ${x_server} ${x_file}
if [ $? -ne 0 ]
then
  echo "ERROR : Expect script encountered an error."
  exit 1
fi

正如您所看到的,即使没有文件传输到目标,因为它在源代码中不可用,脚本仍然会退出,退出代码为零。

2 个答案:

答案 0 :(得分:0)

您必须自己处理错误。试试这样:

set err 0
send -- "put ${srcDir}/${XFILE} ${trgDir}/test_file.txt\r"
expect {
  -re "File .* not found" {
    set err 1
    exp_continue
  }
  "sftp> "
}
send -- "bye\r"
expect eof

exit $err

答案 1 :(得分:0)

为什么不在生成sftp之前检查文件是否存在?

set srcFile [file join $srcDir $XFILE]
if {! [file exists $srcFile]} {
    puts stderr "File not found in source: $XFILE"
    exit 1
}

spawn /usr/ldir/bin/sftp ${uid}@${XSERVER}
...