评估远程主机上的bash变量

时间:2015-06-30 10:08:00

标签: bash

我很难评估远程主机上的变量。

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评估中使用。

1 个答案:

答案 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