捕获 Expect 脚本的退出代码

Capture exit code of Expect script

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

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

test.sh:

#!/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

test.exp:

#!/usr/local/bin/expect -f

set timeout -1
set XSERVER [lindex $argv 0]
set XFILE [lindex $argv 1]

set uid "user"
set pwd "password"
set srcDir "/tmp/src"
set trgDir "/tmp/trg"

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

expect -re "Are you sure you want to continue connecting (yes/no)?" {
   send -- "yes\r"
   expect -re "assword: "
   send -- "$pwd\r"
   } -re "assword: " {
      send -- "$pwd\r"
   }
expect -re "sftp> "
send -- "put ${srcDir}/${XFILE} ${trgDir}/test_file.txt\r"
expect "sftp> "
send -- "bye\r"
expect eof

catch wait result 
exit [lindex $result 3]

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

+ + date +%Y%m%d
DT=20160919
+ RXHOME=/tmp
+ x_server=A1234
+ x_file=test_20160919.dat
+ cd /tmp/scripts
+ ./test.exp A1234 test_20160919.dat
spawn /usr/ldir/bin/sftp user@A1234
Connecting to A1234...

user@A1234's password:
sftp> put /tmp/src/test_20160919.dat /tmp/trg/test_file.txt
File "/tmp/src/test_20160919.dat" not found.
sftp> bye
+ [ 0 -ne 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

为什么不在生成 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}
...