用于通过 SFTP 传输文件的 Shell 脚本已经编写好,并且在 AIX 版本 6.1 上运行良好。我正在使用 SAP 数据服务和真正的 shell 脚本开发 ETL。在单元测试期间,我为 SFTP 提供了不存在的目标文件夹以模拟用户更改目标文件夹名称的情况,但在命令cd后它没有失败并返回退出代码 0,但回显错误消息:无法规范化: 失败。这使得 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
我echo
$?
在 command 之后立即变量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 的大力帮助下,我实施了这个解决方案:Catching $? 在命令 /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
谢谢你们!很棒的论坛!