我很难评估远程主机上的变量。
myCmd='echo $myVar'
myVar=test
eval $myCmd # Outputs "test"
ssh -T -p <port> <user>@<host> <<ENDSSH
echo $myVar # Outputs "test"
eval $myCmd # Outputs empty string
ENDSSH
要求在myCmd
之前实例化myVar
变量。这就是为什么单引号用于冻结字符串评估。
如上例所示,myVar
可从远程主机访问,但未在myCmd
评估中使用。
答案 0 :(得分:4)
这是因为myVar
在heredoc中不可用。事先替换变量并且回声起作用,因为它实际上是echo test
。 eval部分是eval echo $myVar
但是就像我说的那样,myVar没有在这个上下文中定义,因此它实际上是eval echo
。
有关详细信息,请查看此问题。 Why does bash -c "false; echo $?" print 0?
解决方案可能是将变量复制到heredoc的上下文中。
myCmd='echo $myVar'
myVar=test
ssh -T -p <port> <user>@<host> <<ENDSSH
myVar=$myVar
eval $myCmd
ENDSSH
我不知道这是否适合您的具体情况,但至少是一个起点。
另一个解决方案,可能是更好的解决方案,首先扩展表达式,然后将其传递给heredoc。
myCmd='echo $myVar'
myVar=test
myCmd=$(eval echo $myCmd)
ssh -T -p <port> <user>@<host> <<ENDSSH
eval $myCmd
ENDSSH