从 shell 脚本运行时,FTP“放置”不会将文件复制到远程主机,但在手动运行时将文件复制到远程主机

从 shell 脚本运行时,FTP“放置”不会将文件复制到远程主机,但在手动运行时将文件复制到远程主机
ftp -n ${FTP_HOST} << STOP
    user ${FTP_USERNAME} ${FTP_PASSWORD}

    binary
    lcd ${FTP_FROM_DIR}
    cd ${FTP_TO_DIR}
    put ${reportFileName}   
STOP

这是我的代码,它没有成功地将文件复制到远程主机,但手动使用它可以成功地将文件复制到远程主机。

从脚本运行时,控制台中会出现“(本地文件)用法:放置本地文件远程文件”。

可能是什么问题呢?

答案1

我怀疑你的部分问题在于你构建定界符的方式。像这样尝试一下:

$ ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}

binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}   
STOP

如果您确实想要在命令中使用这些空格/制表符,那么您需要更改为这种形式的heredoc:

$ ftp -n ${FTP_HOST} <<-STOP
    user ${FTP_USERNAME} ${FTP_PASSWORD}

    binary
    lcd ${FTP_FROM_DIR}
    cd ${FTP_TO_DIR}
    put ${reportFileName}   
STOP

每当您的定界文档中有空格/制表符时,您都需要使用 for<<-来告诉 shell 在运行其中包含的命令之前去除前导空格/制表符。

关于使用 echo 的侧边栏

当您解析脚本中的变量并无意中用于echo打印消息时,您通常会得到的不仅仅是您感兴趣的字符串。echo还将包括尾随换行符。您可以在此示例中看到它:

$ echo $(echo hi) | hexdump -C
00000000  68 69 0a                                          |hi.|
00000003

0a换行符的 ASCII 代码。因此,您通常需要使用以下-n开关来禁用此行为echo

$ echo -n $(echo hi) | hexdump -C
00000000  68 69                                             |hi|
00000002

或者甚至更好地升级到使用printf.

参考

相关内容