我创建了一个函数
function getqueue() {
urlqueuename="urlcall"
ouput=`curl $urlqueuename`
queue=$(echo $ouput | jq -r '.queueName')
echo $queue
}
我正在使用脚本中的 ssh 调用,例如:
ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" $username@$IP<<EOF
queue=$(getqueue)
echo "Queue name : $queue"
EOF
但是队列为空,也尝试$(typeset -f)
在远程调用中使用函数,但变量仍然为空
任何有关相同的指导将受到高度赞赏。
答案1
这里的文档没有被引用,这意味着变量扩展和命令替换是在文档形成时在本地进行的。在这种情况下,它不会达到预期的效果,因为它最终会像这样
queue=somevalue
echo "Queue name : "
也就是说,它将扩展为设置变量值的脚本queue
,但由于变量也在 打印的字符串内扩展echo
,因此它的正确值(在执行时)将永远不会显示。
ssh
请注意,此扩展甚至在调用之前就已完成。
如果curl
调用等需要在远程主机上进行(否则实际上没有理由发送此处文档脚本,或者ssh
根本没有理由进行调用),然后引用此处文档。您可以通过使用来做到这一点<<'EOF'
。
然而,这也意味着该函数getqueue
需要在远程脚本的环境中定义。您要么必须在此处文档中包含该函数,要么选择所需的部分。
由于该功能基本上只是做
curl urlcall | jq -r '.queueName'
你可以做
ssh -T -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i "$HOME_DIR/<pemfile>" "$username@$IP" <<'REMOTE_SCRIPT'
queue=$(curl urlcall | jq -r '.queueName')
printf 'The queue name is "%s"\n' "$queue"
REMOTE_SCRIPT
如果某些扩展需要在本地进行,而另一些则需要远程进行,那么不引用此处文档,但转义$
应远程扩展的内容。例如,
ssh user@server <<SCRIPT
remote_var=\$( something )
printf 'remote_var = "%s", local_var = "%s"\n' "\$remote_var" "$local_var"
SCRIPT
在上面的例子中,remote_var
正在远程设置。我们无法在此处文档中分配值local_var
(并且期望能够使用$local_var
该值,原因与上面相同),但是调用printf
将打印此处变量在此处时所具有的值-document 已展开(就在调用之前ssh
)。