【问题标题】:How can I execute a shell script at the end of SFTP execution?如何在 SFTP 执行结束时执行 shell 脚本?
【发布时间】:2018-01-12 20:11:40
【问题描述】:

我有一个 shell 脚本,在其中我执行SFTP 并将我的文件传输到远程主机。

我可以将文件传输到远程主机,但是我的父shell脚本代码,一旦SFTP完成,就无法执行。

#!/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."

我没有看到“完成”。在控制台上打印。有什么线索吗?

【问题讨论】:

  • 你的脚本真的像问题中出现的那样缩进吗?
  • 是的。我是新来的。我不应该缩进吗?
  • 取消缩进(或只是 END_SCRIPT 行)肯定会解决问题
  • 酷,它解决了这个问题 :) 谢谢。但是,原因是什么?
  • 或者,如果缩进是通过制表符,你可以使用&lt;&lt;- END_SCRIPT 语法(注意破折号)

标签: bash shell ssh sh sftp


【解决方案1】:

问题是由于缩进。有两种可能的解决方案

  1. 要么去掉缩进(至少对于END_SCRIPT 行),
  2. 或确保缩进是通过制表符而不是空格,并使用&lt;&lt;- 而不是&lt;&lt; 重定向运算符。

您还必须确保END_SCRIPT 之后没有空格。

这里的文档

这种类型的重定向指示 shell 从 当前源,直到包含 分隔符的行(没有 尾随空格) 可见。到那时为止的所有行 然后用作命令的标准输入。

here-documents的格式为:

      <<[-]word
              here-document
      delimiter

无参数和变量扩展,命令替换, 对 word 执行算术扩展或路径名扩展。 如果 word 中的任何字符被引用,则分隔符是 word 上引号删除的结果,以及 here-document 中的行 没有展开。如果 word 没有被引用,则所有行 here-document 进行参数扩展,命令 替换和算术扩展,字符序列 \&lt;newline&gt; 被忽略,\ 必须用于引用字符 \$ 和`。

如果重定向运算符为&lt;&lt;-,则所有前导制表符 从输入行和包含的行中删除 分隔符。这允许 shell 脚本中的 here-documents 以自然的方式缩进。

【讨论】:

    【解决方案2】:

    heredocs 要求出现在 &lt;&lt; 旁边的内容应该是 完全如此制作以结束heredoc。

    在您的情况下,缩进引入的制表符(或可能之前的空格)heredoc delim END_SCRIPT 以便它不再被视为分隔符。 所以sftp 命令继续寻找它从未找到的分隔符。

    下面是格式。

    command <<HEREDOC_DELIM
    
    HEREDOC_DELIM 
    # Note that nothing should be put in front of HEREDOC_DELIM - no indents.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-15
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多