我有一个shell脚本,我在其中SFTP
并将我的文件传输到远程主机。
我可以将文件传输到远程主机,但是一旦SFTP
完成,我的父shell脚本代码就无法执行。
#!/bin/bash
set -e
echo "Starting SFTP..."
cd "/Users/myuser/myfolder"
sftp -o "StrictHostKeyChecking no" admin@myserver.myorg.com << END_SCRIPT
cd /some/folder/on/remote/host
put -r .
bye
END_SCRIPT
echo "Done."
我没有看到“完成”。在控制台上打印。有线索吗?
答案 0 :(得分:4)
问题是由于缩进造成的。有两种可能的解决方案
END_SCRIPT
行),<<-
而不是<<
重定向运算符。您还必须确保END_SCRIPT
之后没有空白。
此处文件
这种重定向指示shell从中读取输入 当前源直到包含唯一分隔符的行(没有 可见尾随空白)。所有的线都读到了那一点 然后用作命令的标准输入。
here-documents的格式为:
<<[-]word here-document delimiter
没有参数和变量扩展,命令替换, 对字进行算术扩展或路径名扩展。 如果引用单词中的任何字符,则分隔符为 单词上的引号删除结果,以及here-document中的行 没有扩大。如果单词没有引用,则所有行都是 here-document受参数扩展,命令 替换和算术扩展,字符序列 忽略
\<newline>
,并且必须使用\
来引用字符\
,$
和`。如果重定向运算符为
<<-
,则为所有前导制表符 从输入行和包含的行中删除 分隔符。这允许shell脚本中的文档 以自然的方式缩进。
答案 1 :(得分:1)
heredocs需要<<
旁边显示的内容
完全是为了结束heredoc而产生的。
在你的情况下缩进引入标签(或之前可能的空格)heredoc delim END_SCRIPT
,以便它不再被视为分隔符。
所以sftp
命令继续寻找它从未找到的分隔符。
以下是格式。
command <<HEREDOC_DELIM
HEREDOC_DELIM
# Note that nothing should be put in front of HEREDOC_DELIM - no indents.