在 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种传递信息的路径:
- 通过说明退出代码。
- 通过输出。
- 通过创建文件。
不可能更改父进程的(环境)变量。所有子进程都是如此,您的 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"
我有一个脚本在做这样的事情:
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种传递信息的路径:
- 通过说明退出代码。
- 通过输出。
- 通过创建文件。
不可能更改父进程的(环境)变量。所有子进程都是如此,您的 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"