【问题标题】:Reuse variable in EOF bash script在 EOF bash 脚本中重用变量
【发布时间】:2018-01-04 10:23:38
【问题描述】:

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

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

有没有办法做到这一点?

【问题讨论】:

  • 怎么会这样呢,here-doc里面的命令是在远程服务器的shell中运行的,var1是在你本地机器的shell中定义的
  • 注意:如果我在 EOF 上远程 '',则 var2 在块内不再可用

标签: bash variables eof


【解决方案1】:

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

  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"

【讨论】:

  • 嗨 Alfe,对不起,我的错误,但它似乎没有按预期工作:输出是这样的:\n ./file.bash: rowxx:警告:« here-document » 在第 32 行分隔在文件末尾(而不是 « EOF »)\n $var2 的值,分配 1>&2\n $var1 的值(以“Linux xxxx 开头 ... Debian GNU/Linux 系统中包含的程序是免费软件; 每个程序的确切分发条款在 /usr/share/doc/*/copyright 中的各个文件中进行了描述。\n [...],但没有 $var2 的任何值\n 没有分配的 $var2 的值 (就在 EOF 之前)
  • Alfer,经过一些测试,我在这里找到了解决方法:echo $var2 EOF) var3=echo "$var1" | tail -n 1 问候。 echo "Et voila le fichier : $bkp_file"
猜你喜欢
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多