Linux 从bash调用函数

Linux 从bash调用函数,linux,bash,unix,heredoc,Linux,Bash,Unix,Heredoc,我正在从克隆存储库的herdoc调用一个函数。但是存储库是在本地机器上克隆的,而不是在我想要的远程机器上克隆的。该脚本在本地计算机上执行 _git_clone() { git clone myrepo git fetch --all --tags } ssh myserver <<EOF echo $(_git_clone) EOF \u git\u clone(){ git克隆myrepo git fetch--all--tags } ssh-myse

我正在从克隆存储库的herdoc调用一个函数。但是存储库是在本地机器上克隆的,而不是在我想要的远程机器上克隆的。该脚本在本地计算机上执行

_git_clone() {
    git clone myrepo
    git fetch --all --tags
}

ssh myserver <<EOF
    echo $(_git_clone)
EOF

\u git\u clone(){
git克隆myrepo
git fetch--all--tags
}

ssh-myserver您需要将代码逐字传输到另一台服务器,以便在那里运行它。带有不带引号的起始分隔符的heredoc的工作方式类似于双引号字符串,这意味着在将结果字符串传递到远程服务器之前运行的任何命令替换。您可以通过将函数定义放在heredoc中并单引号引用起始分隔符来解决此问题:


ssh myserver您需要将代码逐字传输到另一台服务器,以便在那里运行它。带有不带引号的起始分隔符的heredoc的工作方式类似于双引号字符串,这意味着在将结果字符串传递到远程服务器之前运行的任何命令替换。您可以通过将函数定义放在heredoc中并单引号引用起始分隔符来解决此问题:

ssh myserverhere文档的内容在本地计算,就像用双引号括起来的字符串一样。为了避免这种行为,您需要“引用”here文档,如下所示:

ssh myserver <<'EOF'
  echo $(_git_clone)
EOF
但这似乎不必要地复杂;您不妨这样做:

ssh myserver <<EOF
    git clone myrepo
    git fetch --all --tags
EOF
无参数扩展、命令替换、路径名扩展或 对word执行算术展开如果word中有任何字符 则分隔符是word上删除引号的结果, 此处文档中的行不会展开。

我强调了关键信息。

此处文档的内容是在本地计算的,就像用双引号括起来的字符串一样。为了避免这种行为,您需要“引用”here文档,如下所示:

ssh myserver <<'EOF'
  echo $(_git_clone)
EOF
但这似乎不必要地复杂;您不妨这样做:

ssh myserver <<EOF
    git clone myrepo
    git fetch --all --tags
EOF
无参数扩展、命令替换、路径名扩展或 对word执行算术展开如果word中有任何字符 则分隔符是word上删除引号的结果, 此处文档中的行不会展开。


我强调了关键信息。

准确地说,这就是使用i0b0答案中的想法解决我问题的原因:

_git_clone() {
    git clone myrepo
    git fetch --all --tags
}

ssh myserver <<EOF
    $(declare -f _git_clone)
    _git_clone
EOF

\u git\u clone(){
git克隆myrepo
git fetch--all--tags
}

ssh myserver准确地说,这就是使用i0b0答案中的想法解决我的问题的原因:

_git_clone() {
    git clone myrepo
    git fetch --all --tags
}

ssh myserver <<EOF
    $(declare -f _git_clone)
    _git_clone
EOF

\u git\u clone(){
git克隆myrepo
git fetch--all--tags
}

ssh myserver我刚刚尝试了选项2,我得到了以下结果:-bash:line 2:\u git\u clone:command not found要使用第二个选项,需要将分隔符保留为不带引号的状态。否则,它会尝试在另一台主机上运行该函数,而该主机尚未定义。好的,是的,我想在另一台主机上运行它,这就是我添加引号的原因。如果我删除它们,它会工作,但会将其克隆到本地计算机。我刚刚尝试了选项2,我得到了以下结果:-bash:line 2:\u git\u clone:command not found您需要将分隔符保留为不带引号才能使用第二个选项。否则,它会尝试在另一台主机上运行该函数,而该主机尚未定义。好的,是的,我想在另一台主机上运行它,这就是我添加引号的原因。如果我删除它们,它会工作,但会将其克隆到本地计算机。