3

用于通过 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 

谢谢你们!很棒的论坛!

4

1 回答 1

1

首先,我假设您使用的是 OpenSSH sftp

当命令失败时, OpenSSHsftp确实会中止脚本并以 , 退出。1cd

所以你的问题可能不在于 SFTP 脚本,而是在某种程度上你捕获了退出代码。

如果您分享详细信息,如何捕获退出代码,您可能会得到更具体的答案。

至于你的测试echo $?
你把echo $?命令放在哪里?到您的 SFTP 脚本 ( $INPUT_FILE)?sftp没有echo命令;它也无法解决$?

如果你像这样把它放到 shell 脚本中:

echo cd $TARGET_REMOTE_DIR>>$INPUT_FILE
echo $?

它不做,你想要什么。您在这里只是查询上一个echo命令的结果,这不太可能失败。

于 2013-05-27T07:05:10.043 回答