Bash 使用EOF在远程机器上执行ssh时,如何调用其他函数中的函数?

Bash 使用EOF在远程机器上执行ssh时,如何调用其他函数中的函数?,bash,shell,ssh,scripting,eof,Bash,Shell,Ssh,Scripting,Eof,所以,我试图在bash中使用EOF调用远程机器上的函数。 以下是一个例子: #!/bin/bash other_func() { c='This is it'; echo $c; } test_func() { a='this is some random string' ssh -i "somepemkey.pem" ubuntu@xx.xx.xx.xx << EOF b='some random sting inside remote server'; echo $a; echo

所以,我试图在bash中使用EOF调用远程机器上的函数。 以下是一个例子:

#!/bin/bash
other_func() {
c='This is it';
echo $c;
}
test_func() {
a='this is some random string'
ssh -i "somepemkey.pem" ubuntu@xx.xx.xx.xx << EOF
b='some random sting inside remote server';
echo $a;
echo \$b;
other_func
EOF
}
test_func
所以,现在我得到了这个错误:找不到other_func:command

我不想创建一个文件并在其中放入一个函数,然后将其复制到远程计算机中,然后在那里调用它。 我也不想把我的函数放在这个文档中

ssh user@remote  <<____EOF
    other_func() {
        c='This is it'
        # backslash required inside here doc
        # quoting should be fixed outside here doc, too
        echo "\$c"
    }
    other_func
____EOF
在上面的示例中,本地机器中的变量可以在远程机器中调用,那么如何在远程机器中调用本地函数呢

为什么EOF不理解远程机器中的函数调用


所以,我通过添加这行$declare解决了这个问题 -F 其他职能;出口 -F 紧接着的另一个函数ubuntu@xx.xx.xx.xx

因为ssh创建的远程shell无法访问在运行ssh的计算机上创建的变量或函数,就像它无法从该ssh会话中读取运行ssh的服务器上的文件一样。您希望在远程计算机上提供的任何本地内容都需要以某种方式复制到远程计算机上

对于一个只需要在远程机器上执行的函数,只需将其放在here文档中即可

ssh user@remote  <<____EOF
    other_func() {
        c='This is it'
        # backslash required inside here doc
        # quoting should be fixed outside here doc, too
        echo "\$c"
    }
    other_func
____EOF
对于一个本地和远程都需要的函数,可以将它放在一个单独的文件中,然后以某种方式复制它

# make func available locally
. path/to/func_def

ssh user@remote <<____EOF
    # make func available remotely
    $(cat path/to/func_def)
    # and call it
    other_func
____EOF 

但是,像这样内联函数是相当模糊的;也许最好只是将文件scp到每台服务器上您需要的一个标准位置。

@Cyrus纠正了这个问题,尝试在您的here doc代码中移动您的函数other\u func。@Cyrus您想在其他文件中移动other\u func,然后在EOF中传递它吗?因此,我通过添加$declare这一行解决了这个问题 -F 其他职能;出口 -F 紧接着的另一个函数ubuntu@xx.xx.xx.xx.I相信你的意思是$declare-f other_func。除非您需要在ssh sesion中的子shell中使用函数,否则导出-f应该是不必要的。这是将其放入文件中并使其可用的简单方法,但变量可以在远程机器的EOF中获取,因此函数必须执行相同的操作。我无法在EOF中创建该函数,因为该函数位于运行它的服务器中;它看起来像英语,但单词似乎不太合适。你认为你可以更新你的问题,更详细地说明你的限制吗?我已经更新了问题,我希望这变得更清楚。