在 EOF bash 脚本中重用变量

Reuse variable in EOF bash script

我有一个脚本在做这样的事情:

var1=""
ssh xxx@yyy<<'EOF'
[...]
var2=`result of bash command`
echo $var2 #print what I need
var1=$var2 #is there a way to pass var2 into global var1 variable ?
EOF

echo $var1  # the need is to display the value of var2 created in EOF block

有办法吗?

一般来说,一个执行的命令有3种传递信息的路径:

  1. 通过说明退出代码。
  2. 通过输出。
  3. 通过创建文件。

不可能更改父进程的(环境)变量。所有子进程都是如此,您的 ssh 进程也不例外。

不过,我不会依赖 ssh 来传递远程进程的退出代码(因为即使它在当前的实现中有效,它也很脆弱;ssh 也可能想声明它自己的成功或失败及其退出代码,而不是远程进程的)。

使用文件似乎也不合适,因为远程进程可能有不同的文件系统(但如果远程和本地计算机共享一个 NFS,例如,这可能是一个选项)。

所以我建议使用远程进程的输出来传递信息。你可以这样实现:

var1=$(ssh xxx@yyy<<'EOF'
[...]
var2=$(result of bash command)
echo "$var2" 1>&2 # to stderr, so it's not part of the captured output
                  # and instead shown on the terminal
echo "$var2"      # to stdout, so it's part of the captured output
EOF
)

echo "$var1"