已经编写了一个用于通过SFTP传输文件的Shell脚本,在AIX Version 6.1上运行良好。我正在使用SAP数据服务开发ETL,并对Shell脚本编写非常陌生。在单元测试期间,我提供了不存在的目标文件夹,以模拟目标文件夹名称被用户更改的情况,但是在命令cd之后返回退出代码0,尽管回显错误消息:Couldn't canonicalise: Failure。这使得ETL过程不知道文件没有被传输。当我在脚本中注入exit 1时,ETL作业捕获到了SFTP失败并自行失败,这是预期的行为。
我的问题是:如何调整现有的调用SFTP命令的Shell脚本以退出代码1?
以下是脚本摘录:
'#!/bin/sh
....
echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE
echo put $TARGET_LOCAL_DIR$TARGET_FILE_NAME>>$INPUT_FILE
echo quit>>$INPUT_FILE
/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME
当我在执行cd
命令后,立即打印出$?
变量。如果远程目录拼写错误,则返回0。我的想法是,在执行cd
命令后,检查行内是否存在错误消息,如果长度不为0,则退出并返回代码1。
伪代码示例如下:
error_msg = get_error_msg({cd $TARGET_REMOTE_DIR>>$INPUT_FILE})
if length(trim(error_msg)) <> 0 then
echo “Cannot change directory! Aborting…”
exit 1
fi
任何评论都受到欢迎。
干杯!
在Martin的帮助下,我已经实现了这个解决方案:在/usr/bin/sftp命令之后立即捕获$?返回代码,并强制退出以捕获的错误!
/usr/bin/sftp -b $INPUT_FILE $USER@$HOSTNAME
if [[ $? -ne 0 ]]; then
" SFTP Error while accessing remote target directory! Error message"
exit $?
fi
谢谢大家!这是一个很棒的论坛!
/usr/bin/sftp ...
之后加上echo $?
了吗?那是唯一能够起作用的地方,而且确实有效。 - Martin Prikryl