SFTP文件传输的Shell脚本已经编写并在AIX V6.1上正常运行。我正在使用SAP数据服务开发ETL,并开发真正的shell脚本。在单元测试期间,我为SFTP提供了不存在的目标文件夹,以模拟用户更改目标文件夹名称的情况,但是在命令 cd 并且返回退出代码0后它没有失败,尽管回显错误消息:无法规范化:失败。这使得ETL进程无法识别文件未被传输。当我在脚本中注入退出1时,ETL作业捕获了SFTP失败并自行失败,这是预期的行为。
我的问题是:我如何调整现有的shell脚本调用SFTP命令以退出代码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
$?
变量在命令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
谢谢大家!很棒的论坛!
答案 0 :(得分:0)
首先,我假设您使用的是OpenSSH sftp
。
当sftp
命令失败时,OpenSSH 1
确实会中止脚本并以cd
退出。
所以问题可能不在于SFTP脚本,而在于你捕获退出代码的方式。
如果您分享详细信息,如何捕获退出代码,您可能会得到更具体的答案。
关于echo $?
的测试:
你在哪里放echo $?
命令?到您的SFTP脚本($INPUT_FILE
)? sftp
没有echo
命令;它也无法解决$?
。
如果你把它放到这样的shell脚本中:
echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE
echo $?
它没有,你想要什么。你在这里只是查询先前echo
命令的结果,这不太可能失败。